2013-04-18 13 views
7

我一直在閱讀有關inverse_of和我在網上看到的所有內容似乎都不一致並且讓我困惑。如果你看看here,你可以看到在ActiveRecord中rails3的inverse_of有什麼限制

有一些限制inverse_of支持:通過協會:

  • 他們不會一起工作。
  • 它們不適用於:多態關聯。
  • 他們不與:作爲協會。
  • 對於belongs_to關聯,忽略has_many反向關聯。

但正上方的是,他們給這個例子

class Customer < ActiveRecord::Base 
    has_many :orders, :inverse_of => :customer 
end 

class Order < ActiveRecord::Base 
    belongs_to :customer, :inverse_of => :orders 
end 

我覺得他們說的第一inverse_of什麼都不做,但如果是這樣,爲什麼他們這樣做?

此外,即使上述事情說inverse_of不通過關聯設定工作,this page

如果您使用的連接模型belongs_to的,它是設置一個好主意:在belongs_to的inverse_of>選項,這將意味着下面的例子可以正常工作,其中>標籤是的has_many:通過協會):

,並給出這個例子

@post = Post.first 
@tag = @post.tags.build :name => "ruby" 
@tag.save 

最後一行應該保存通過記錄(一個Taggable)。 inverse_of設置:如果>這隻會工作

class Taggable < ActiveRecord::Base 
    belongs_to :post 
belongs_to :tag, :inverse_of => :taggings 
end 

對我來說,這一切似乎是不一致的,高度混亂。但總的來說,我認爲在每一個關係上只是說反義詞並沒有什麼壞處。那是問題嗎?我見過很多人在SO上提出這樣的問題,並沒有看到任何人的堅定或肯定。

回答

1

有沒有總是指定它,並允許軌道優化加載對象,因此你可以上下兩個方向的活動記錄模型關係鏈沒有得到奇怪的錯誤在一個對象上更改值不會改變它的參考。

將它設置在無法工作的地方的唯一問題是如前所述的某些類型,如果它們默默失敗,如果在更改某些東西后沿着方法鏈走錯方向,您會得到affore提及的錯誤

這是從軌道API

d = Dungeon.first 
t = d.traps.first 
d.level == t.dungeon.level # => true 
d.level = 10 
d.level == t.dungeon.level # => false 

地牢實例d和t.dungeon在上面的例子中是指從數據庫中的相同對象的數據,但實際上是不同的數據在內存中的副本。在關聯上指定:inverse_of選項可讓您告訴Active Record關於反向關係,並優化對象加載。

相關問題