2010-06-30 50 views
5

考慮以下設置:在Rails中,如何在不通過數據庫的情況下檢索belongs_to關聯中的對象?

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

而這個控制檯會話:

>> p = Parent.find 41 
>> p.some_attr = 'some_value' 
>> c = p.children.build 
>> c.parent 

通過看我的日誌文件,我可以看到c.parent被查詢父對象的數據庫。我希望訪問現有的內存中對象(p),因爲我需要訪問父級的some_attr值,該值尚未存儲在數據庫中。有沒有辦法做到這一點? c.parent(force_reload = false)不會讓我在那裏。

回答

5

您可以使用:inverse_of來設置它。閱讀更多關於它here

+0

是的,:inverse_of的開發正是爲了適應這種需求。 – KenB 2010-08-26 21:04:34

1

ActiveRecord並未盡力保證相同數據庫對象的內存中對象都完全相同。這是DataMapper確實保證的。

我意識到你的例子可能是簡化爲了問你的問題,但只是從一個天真的看看它 - 爲什麼你不使用p而不是c.parent?

另一個可能有益的建議,更新保存於母公司的分貝:

p = Parent.find 41 

# do this... 
p.some_attr = 'some_value' 
p.save 

# OR this... 
p.update_attribute(:some_attr, 'some_value') 

c = p.children.build 
c.parent 

我不知道如果c.parent(false)(「不從DB重裝」)將在這裏做的伎倆,因爲這是一個新鮮的兒童對象。但你也可以嘗試。

+0

你是正確的關於被簡化的例子 - 在現實生活中,我正在處理一個驗證場景,其中孩子的有效性取決於父級的屬性(實際上是兄弟對象集合的屬性)。因此,在子對象的驗證代碼中,我需要訪問內存中存在的父對象,並提供所有在提交HTML表單時分配/更新的屬性,而不是在db中放置的陳舊版本。我使用的是acceptersted_attributes_for:children,所以我知道所有事情都是在內存中設置的。 – KenB 2010-06-30 20:33:37

+1

您可以在交易中完成整件事 - 這樣您可以保存父項,然後檢查驗證,如果驗證失敗,則回滾。 – 2010-06-30 21:02:53

相關問題