1

rails 文档为例:

class Dungeon < ActiveRecord::Base
  has_many :traps, :inverse_of => :dungeon
  has_one :evil_wizard, :inverse_of => :dungeon
end

class Trap < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :traps
end

class EvilWizard < ActiveRecord::Base
  belongs_to :dungeon, :inverse_of => :evil_wizard
end

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

以下表达式返回 false,尽管它预期返回 true(至少对于 Rails 3.1):

d.level == t.dungeon.level # => false

有什么问题:inverse_of

4

1 回答 1

0

我不确定这是否是一个错误,但是当您使用关联之类的关联时,inverse_of它不起作用:

d.traps.where('1=1')[0].dungeon.object_id != d.object_id
d.traps.first.dungeon.object_id != d.object_id

虽然当你像数组一样使用它时,它的inverse_of行为正确:

d.traps.map { |t| t.dungeon.object_id } == [d.object_id]
d.traps[0].dungeon.object_id == d.object_id

创建对象时它可以正常工作:

d.traps.build.dungeon.object_id == object_id

它不适用于带有 has_many 的belong_to(并且它在文档中的某处指定):

t.dungeon.tasks[0].object_id != t.object_id

所以为了避免意外inverse_of

  1. 使用[0]代替first
  2. 不要实现依赖它的逻辑(其他人可能会替换你select(&:some_predicate?)some_scope,你的代码将不再有效)
  3. 不要在关联的另一端使用inverse_offor belongs_towithhas_many
于 2012-08-04T09:22:54.420 回答