2013-02-18 7 views
13

ここに概説したように:なぜinverse_ofを使用したくないのですか?

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

inverse_ofは、メモリ団体にキャッシュとデータベースのクエリを最小限に抑えるための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 

for `belongs_to` associations `has_many` inverse associations are ignored. 

だから私はいくつかの質問を持っています。

  1. has_manyの逆アソシエーションは、belongs_toで無視されますか?もしそうなら、その例はどのように意味がありますか?何もしないでください。 .dungeonへの最後の呼び出しが全体の新しいクエリを生成し、単にのために達していないと

    dungeon.traps.first.dungeon 
    

  2. 私の知る限り(それは何もしないと仮定して)すべてこれを行うことを可能にするようなものですメモリ関連で。それが正しいと仮定すると、なぜ私はその行動を望んでいないでしょうか?なぜ私はすべての関連付けにinverse_of:を貼っていませんか?

答えて

6

私は、協会は、あなたがそれが何であるかを示すためにinverse_of使用モデルのストレート変曲ではないインフレクタとどのようにレールについて書き始めました。しかし、私があなたが言及したセクションにスクロールし、これは私がそれを見ている方法です。本当に意味がありません。もちろんdungeon.traps.first.dungeon

# let's pick a dungeon 
d = Dungeon.first 

# say you find also find a trap that belongs to this particular d 
t = Trap.find(...) 

# then t.dungeon is the exact same object as d 
d == t.dungeon 

と私はこれが存在する理由です疑う:あなたが何かを持っていると言います。個人的に私はどこでどのようにこれを使用するのかわかりませんが、それらの例はユースケースを埋めるようです。それは次のようになります:

# you have an attribute level on dungeon 
d.level # => 5 

# now say you have a comparison after a modification to level 
d.level = 10 

# now without inverse_of the following thing occurs 
d.level   # => 10 
t.dungeon.level # => 5 

# d was updated and since t.dungeon is a whole different object 
# it doesn't pick up the change and is out of sync but using invers_of you get 
d.level   # => 10 
t.dungeon.level # => 10 

# because d and t.dungeon are the very same object 

物事を明確にする希望。

+0

ので、それは私が10(代わりにD.LEVELの= 10)= t.dungeon.levelを言っていた場合、そのD.LEVELも更新されませんでしたことを意味していそれが無視されたのでinverse_ofを設定すると?一般的に、コレクションのメンバーを更新すると、そのメンバーの他のインスタンスには同期されません。しかし、少なくともそれが最終的にそれをサポートしてくれることを期待して、inverse_ofをどこに置いても問題は生じないようです。 – bdwain

+0

@bdwainこれはRailsが自動的に(名前が一致した場合に)この 'inverse_of'関係を自動的に推測すると思っていたので、これは非常に面白いです。最近(これに関連するモデルの 'accepts_nested_attributes_for'というモデルの検証を行っている間に)これに着手した後、私はあなたの結論に同意する必要があります:' inverse_of'を惜しみなく使ってください。私は何か理由を想像することはできません。 – steve

4

すばらしいニュース! Rails 4.1の基本的な関連では、が自動的にに設定されます。inverse_of

*利便性の向上は、より多くのエッジケースを意味します。

  • :through
  • :foreign_key
  • :conditions
  • :polymorphic
ないは、次のいずれかのオプションを指定しない団体のための のみ作品inverse_of自動の

資源:

http://edgeguides.rubyonrails.org/4_1_release_notes.html http://wangjohn.github.io/activerecord/rails/associations/2013/08/14/automatic-inverse-of.html

+0

"マニュアルの':conditions'は完全には正しくないので、 '' scope'が定義されていないと ""でなければなりません "。 – 244an