Bonjour, j'ai un petit soucis concernant les relations entres les tables dans rails.

J'ai deux modèles : User(créé avec devise) & Cart dont voici le code

class User < ActiveRecord::Base
  has_one :cart

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end
class Cart < ActiveRecord::Base
  belongs_to :user
end

D'après mes connaissances si je récupère un User ou un Cart je dois pouvoir accèder à l'autre de cette manière

@c = Cart.first
@c.user

ou

@u = User.first
@u.cart

Mais aucune ne marche...

Voici la migration qui créé la référence :

class AddUsersRefToCarts < ActiveRecord::Migration
  def change
    add_reference :carts, :users, index: true
  end
end

Merci d'avance pour votre aide..

3 réponses


Seazer
Réponse acceptée

Essaye avec un include :

@u = User.includes(:cart).first

Au singulier car tu as un seul cart (has_one :cart), hésite pas à faire un retour si c'est ça.

Si c'est bien ça et que tu souhaite aller plus loin, tu as cette ressource : Rails4 Preloading

Greenpix
Auteur
Réponse acceptée

Ca ne marche toujours pas.. :( Mais j'ai remarqué quelque chose en console.
Lorsque j'effectue les appels voici le message d'erreur

User Load (0.0ms)  SELECT  "users".* FROM "users"  ORDER BY "users"."id" ASC LIMIT 1
 Cart Load (0.0ms)  SELECT "carts".* FROM "carts" WHERE "carts"."user_id" IN ('1')
SQLite3::SQLException: no such column: carts.user_id: SELECT "carts".* FROM "carts" WHERE "carts"."user_id" IN ('1')
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: carts.user_id: SELECT "carts".* FROM "carts" WHERE "carts"."user_id" IN ('1')

Or ma colonne créé dans cart se nomme users_id et non user_id comme rails le souhiaterais. Mais cette ligne à été créer dans les règles de l'art via les migrations rails (voir plus haut) donc je ne vois pas ou est le soucis. Je n'étais pas sure du "s" à :users dans la migration mais même en l'enlevant ca ne marche pas.

EDIT

Voila ca marche, en réalité mon changement dans la migration étais bien la solution (mettre users au singulier) mais pour une raison que j'ignore ni "rake db:migrate" ni "rake db:reset" n'a changer le nom de la colonne. J'ai du effacer le contenu de schema.rb et supprimer mes fichiers .sqlite3 pour relancer un "rake db:setup".

C'est vrai que ta migration aurait du être :

class AddUserRefToCart < ActiveRecord::Migration
  def change
    add_reference :cart, :user, index: true
  end
end

Je pense que comme tu as donné le nom de la migration au pluriel, il la généré au pluriel.