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 を使用している belongs_to では機能しません (ドキュメントのどこかに指定されています):

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

からの驚きを避けるためにinverse_of

  1. [0]の代わりに使用first
  2. それに依存するロジックを実装しないでください(他の人があなたselect(&:some_predicate?)を置き換えてsome_scope、コードが機能しなくなる可能性があります)
  3. 関連の反対側でinverse_offorbelongs_toを使用しないでくださいhas_many
于 2012-08-04T09:22:54.420 に答える