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..
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
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.