2009-10-01 70 views
2

看起來,當我抓取一些層次結構的ActiveRecord時,有相當多的命中數據庫。我使用:include選項改進了這一點,以充實儘可能多的結構。即便如此,ActiveRecord似乎並沒有將關係的相對方(例如父子)映射爲對記錄的唯一引用。也就是說,我們得到了一個可導航的ActiveRecord結構,但據我所知,它並不能保證給定記錄的唯一副本。有沒有一種方法可以確保ActiveRecord層次結構中每個記錄的一個對象引用?

node = Node.find(1, :include => {:document => :node}) 
node.object_id #A 
node.document.node.object_id #B although I expect/desire A 

在ActiveRecord中不可避免的?有其他人因爲這樣的缺點而轉移到其他ORM嗎? (不要誤解我的意思:ActiveRecord是一個很棒的工具,但是所有的工具都有其優點和缺點)

假設我要寫自己的SQL查詢(它甚至可以是一個存儲過程),返回多個結果集包含我的ActiveRecord層次結構的所有相關數據。有沒有一種無痛的方式,我可以明確映射關聯,而不會讓ActiveRecord錯誤地顯示我的顯式映射以嘗試創建新的關聯?

+0

您可能對此問題感興趣:http://stackoverflow.com/questions/1303874/why-is-activerecord-not-smart-enough-to-know-that-the-objectid-of-the-father -sho – 2009-10-01 20:55:02

+0

是的,謝謝莎拉。我有點問同樣的事情。 – Mario 2009-10-05 12:11:06

回答

0

我根本不認爲ActiveRecord被設計來支持這個想法。它只是意味着你必須使用ActiveRecord,瞭解它的優點和缺點。我從那以後找到了解決這個問題的方法。

我已經看了DataMapper的,我看到它specifially address這個問題:

一行在數據庫 應該等於一個對象引用。 非常簡單的想法。相當深刻的 影響。如果您在ActiveRecord中運行以下代碼 ,您將看到所有虛假的 結果。做相同的DataMapper和 這是真的一路下跌......

0

所以,如果你有一個節點,它有一個parent_id。對於所有節點,父級不能是任何其他節點的父級。換句話說,對於所有節點,parent_id應該是唯一的。

class Node 
    has_one :child, :class_name => "Node", :foreign_key => :parent_id 

    belongs_to :parent, :class_name => "Node" 
    validates_uniqueness_of :parent_id 
end 
0

不幸的是,我認爲你被卡住了。這不是ActiveRecord支持的,據我所知,目前還沒有計劃支持它。正如你在莎拉梅引用的問題中看到的那樣,有一些可能的擔憂。

如果您可以提供更多有關您的使用案例的信息,它可以幫助我們弄清楚是否有另一種方法來處理您的問題。

+0

這是我懷疑的。我想這與ActiveRecord設計模式本身有關。我可以解決它;我只需要注意這個潛在的困難。 – Mario 2009-10-05 12:08:43

0

對於任何人誰過這個年絆倒有人問後(像我!),檢查https://stackoverflow.com/a/4116397/1000655

它建議使用:inverse_of建立雙向關聯。我希望我過去曾多次瀏覽過那些文檔!

相關問題