Relation des tables dans rails

Par Greenpix, il y a 11 ans


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, il y a 11 ans

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, il y a 11 ans

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

Seazer, il y a 11 ans

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.