2010-02-04 3 views
5

Disons qu'un User a beaucoup de Document s, et un seul Document ils travaillent actuellement dessus. Comment est-ce que je représente ceci dans les rails?Rails: has_many, mais aussi has_one par un nom différent

Je veux dire current_user.current_document = Document.first (avec ou sans current_ devant le document) et ne pas changer la collection current_user.documents.

C'est ce que j'ai:

class Document < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :documents 
    has_one :document 
end 

le problème est que quand je dis current_user.document = some_document, il supprime le document préalablement stocké dans current_user.document de current_user.documents. Cela est logique en raison de la relation has_one que Document a, mais ce n'est pas ce que je veux. Comment je le répare?

Répondre

8

Vous devez changer vos modèles

class Document < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_many :documents 

    # you could also use :document, but I would recommend this: 
    belongs_to :current_document, :class_name => "Document" 
end 

post-scriptum Mais méfiez-vous des sauvegardes cycliques. Si vous créez un nouvel utilisateur (et ne l'enregistrez pas encore) et que vous définissez current_document, puis enregistrez l'utilisateur, vous risquez d'avoir des débordements de pile ou d'autres erreurs fous.

+1

Merci! Et juste pour être clair pour les autres, le nom de la colonne dans ce cas sera 'current_document_id' dans la table' users'. – Peter

Questions connexes