2012-04-25 3 views
1

Je suis nouveau sur les rails, et je ne savais pas comment définir le suivi.Rails: Comment déclarer une association un-à-un facultative entre deux modèles

J'ai des modèles Utilisateurs, Invitations et Photos. Chaque utilisateur invite mes autres utilisateurs à afficher une image particulière. L'utilisateur envoie une invitation à l'autre utilisateur; l'invitation peut être liée à une image particulière ou ne peut être liée à une image particulière.

Mon problème était que je n'étais pas sûr de savoir comment associer une relation optionnelle entre l'invitation et l'image.

J'ai:

class Invitation < ActiveRecord::Base 
    has_one :picture 
end 

class Picture < ActiveRecord::Base 
    belongs_to :invitation 
end 

Cependant, lorsque je tente invitation.picture, je reçois l'erreur suivante:

Failure/Error: @user.getsInvited invitation 
    ActiveRecord::StatementInvalid: 
     SQLite3::SQLException: no such column: picture.invitation_id: SELECT "picture".* FROM "picture" WHERE "picture"."invitation_id" = 1 LIMIT 1 

Probablement je besoin d'ajouter l'invitation de la colonne au modèle d'image, mais , est-ce nécessaire? envoyer une photo peut être facultatif dans l'invitation. De plus, si j'avais une seule colonne invitation_id dans l'image, que se passe-t-il si la même image est partagée entre plusieurs invitations?

I.e. chaque invitation peut être associée à une seule image et d'autres invitations peuvent être associées à la même image. Je ne voulais pas que l'image soit "consciente" des invitations, mais peut-être que je devais créer une relation plusieurs-à-plusieurs?

Merci!

Répondre

3

L'invitation est celui qui doit savoir ce qu'il est attaché à:

class Invitation < ActiveRecord::Base 
    belongs_to :picture # means invitation model has a picture_id column 
end 

class Picture < ActiveRecord::Base 
    has_many :invitations 
end 
+1

De cette façon, une invitation a une image en option (juste ne définissez pas le champ 'picture_id';)) –

+0

wow, je Je n'ai pas vu ça venir! Merci! :) – Karan

Questions connexes