2010-02-04 10 views
5

Załóżmy, że User ma wiele Document s i jedną Document, nad którą aktualnie pracują. Jak mam to reprezentować w szynach?Szyny: has_many, ale także has_one pod inną nazwą

Chcę powiedzieć current_user.current_document = Document.first (z lub bez current_ przed dokumentem) i nie zmieniaj kolekcji current_user.documents.

To jest to, co mam:

class Document < ActiveRecord::Base 
    belongs_to :user 
end 

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

problemem jest to, że kiedy mówię current_user.document = some_document, usuwa dokument uprzednio zapisanego w current_user.document z current_user.documents. Ma to sens ze względu na relację has_one, którą ma , ale nie jest to, czego chcę. Jak mogę to naprawić?

Odpowiedz

8

Musisz zmienić swoje modele do

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 

PS: Ale strzeż się cyklicznych zapisów. Jeśli utworzysz nowego użytkownika (i nie zapisasz go jeszcze) i ustawisz current_document, a następnie zapiszesz użytkownika, możesz dostać przepełnienie stosu lub inne szalone błędy.

+1

Dzięki! I dla jasności dla innych, nazwa kolumny w tym przypadku będzie "current_document_id" w tabeli 'users'. – Peter

Powiązane problemy