2013-12-11 189 views
0

我有以下關係。我想要一個職位來has_one current_wrent,但has_many的職位,保持跟蹤wrent對象。我認爲這個問題可能與軌道被混淆了,我正在討論哪種關係。保存父母與子女的關係

當我引用post.current_wrent時,這個返回正確無誤。

Class Post 

include Mongoid::Document 
include Mongoid::Timestamps 
    ... 
has_one :current_wrent, :class_name => "Wrent", :inverse_of => :current_wrent, :autosave => true, :dependent => :destroy 
has_many :wrents, :inverse_of => :post, :dependent => :destroy 
end 

Class Wrent 
.. 
belongs_to :post, :autosave => true 
.. 
end 

當我這樣做.. (在Wrent.rb)

def accept! 
    update_attributes!(:status => 1, :accepted => true) 
    post.current_wrent = self 
    post.available = false 
    post.save! 
    notify_user 
end 

,我得到一個「當前Wrent」是無效的錯誤,可能有人點我的東西我做的這裏錯了嗎?

編輯:這似乎工作正常。 在wrent.rb

Class Wrent 
    .. 
    belongs_to :post, :inverse_of => :wrent, :autosave => true 
    belongs_to :post, :inverse_of => :current_wrent 

在post.rb 類崗位 ...

has_one :current_wrent, :class_name => "Wrent", :inverse_of => :post 
    belongs_to :current_wrent, :class_name => "Wrent", :inverse_of => :post 
    has_many :wrents, :inverse_of => :post, :dependent => :destroy 

我仍然不知道是什麼問題,但現在我可以通過訪問post.current_wrent belongs_to current_wrent_id列和問題似乎消失。

+0

你可以發佈錯誤的完整堆棧跟蹤? – usha

+0

我沒有堆棧跟蹤,但它所做的最後一件事是post.save!並導致它崩潰並返回錯誤「驗證失敗:Current_wrent無效」。這個問題與current_wrent關係定義的方式有關 –

回答

1

您的Wrent模型可能有一個post_id字段,其中存儲了它所屬的帖子的ID。但Post中沒有字段來存儲current_wrent。 Mongoid允許你嵌入對象,所以你可以做的是embeds_one,而不是has_one。

Class Post 

    include Mongoid::Document 
    include Mongoid::Timestamps 
    ... 
    embeds_one :current_wrent, :class_name => "Wrent", :inverse_of => :current_wrent 
    has_many :wrents, :inverse_of => :post, :dependent => :destroy 
end 
+0

謝謝,但我想我不想將它嵌入 - 我不能任意刪除,訪問或修改wrent對象,除非我訪問根文檔,這是我不想做的事。我仍然希望能夠使用Wrent.find或Wrent.create,並且從我的理解中,將它嵌入到單個對象中可以防止它在其他地方被訪問。 –

+0

在這種情況下,您將需要Post類中的belongs_to:current_wrent,而不是has_one來存儲current_wrent對象ID。 –

+0

幾乎我所決定的。謝謝你的幫助! –