从Rails的5.0和伟大的文档。
Guide
双向关联
这是正常的协会在两个方向上工作,需要申报的两种不同的型号:
class Author < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :author
end
默认情况下,活动记录没有按”了解这些关联之间的联系。这可导致失去同步的目的的两个副本:
a = Author.first
b = a.books.first
a.first_name == b.author.first_name # => true
a.first_name = 'Manny'
a.first_name == b.author.first_name # => false
这是因为一个和b.author是两个相同数据的不同内存中表示,并且没有一个自动地从变化到刷新另一个。活动记录提供了:inverse_of选项,以便您可以通知其这些关系的:
class Author < ApplicationRecord
has_many :books, inverse_of: :author
end
class Book < ApplicationRecord
belongs_to :author, inverse_of: :books
end
有了这些变化,活动记录将只加载author对象的一个副本,防止矛盾,使您的应用更高效:
a = Author.first
b = a.books.first
a.first_name == b.author.first_name # => true
a.first_name = 'Manny'
a.first_name == b.author.first_name # => true
有一些限制inverse_of支持:通过协会:
他们不会一起工作。 它们不适用于:多态关联。 他们不与:作为协会。
对于belongs_to关联,忽略has_many反向关联。 每个关联都将尝试自动查找逆关联并尝试启动inverse_of选项(根据关联名称)。大多数具有标准名称的关联都将被支持。但是,包含下列选项协会将不会有他们的倒数自动设置:
您是否理解文档中的注释:“for belongs_to associations has_many反向关联会被忽略。”然而,文档使用了这个确切的例子。我在这里错过了什么? – dynex 2012-02-16 03:41:25
我不完全确定。 'inverse_of'并没有真正被使用过,所以它可能是一个没有很好定义的行为。在您指出该功能之后,我尝试过使用它,但它并没有真正为我做任何有用的事情。 – tadman 2012-02-16 04:05:11
这对我来说非常奇怪,因为在我看来,默认情况下总是需要这种行为,并且只有在无法推断关联名称时才需要使用:inverse_of。此外,定义中的不一致性也很麻烦,但在少数情况下它帮助了我。任何原因,我不应该坚持到处? – Ibrahim 2012-07-06 00:08:52