2011-10-04 5 views
5

私はhas_oneを使うと、それは完全に動作しますが、has_manyでは動作しません。ここで、object_idが別のSQLを実行して再度フェッチするため、object_idが異なることがわかります。ここでinverse_ofはhas_manyで動作しますか?

ruby-1.9.2-p290 :001 > e = Employee.create(name: 'rafael', active: false) 
ruby-1.9.2-p290 :002 > b = Badge.create(number: 1, employee: e) 
ruby-1.9.2-p290 :003 > a = Address.create(street: "123 Market St", city: "San Diego", employee: e) 
ruby-1.9.2-p290 :004 > e = Employee.first 
    Employee Load (0.2ms) SELECT "employees".* FROM "employees" LIMIT 1 
=> #<Employee id: 1, name: "rafael", active: false, created_at: "2011-10-04 17:09:25", updated_at: "2011-10-04 17:09:25"> 
ruby-1.9.2-p290 :002 > e.is_active? 
=> false 
ruby-1.9.2-p290 :003 > e.object_id 
=> 2182895380 
ruby-1.9.2-p290 :004 > e.badge.employee.is_active? 
    Badge Load (17.6ms) SELECT "badges".* FROM "badges" WHERE "badges"."employee_id" = 1 LIMIT 1 
=> false 
ruby-1.9.2-p290 :005 > e.badge.employee.object_id 
=> 2182895380 
ruby-1.9.2-p290 :006 > e.addresses.first.employee.is_active? 
    Address Load (0.2ms) SELECT "addresses".* FROM "addresses" WHERE "addresses"."employee_id" = 1 LIMIT 1 
    Employee Load (0.3ms) SELECT "employees".* FROM "employees" WHERE "employees"."id" = 1 LIMIT 1 
=> false 
ruby-1.9.2-p290 :007 > e.addresses.first.employee.object_id 
    Address Load (0.3ms) SELECT "addresses".* FROM "addresses" WHERE "addresses"."employee_id" = 1 LIMIT 1 
    Employee Load (0.2ms) SELECT "employees".* FROM "employees" WHERE "employees"."id" = 1 LIMIT 1 
=> 2181302220 
ruby-1.9.2-p290 :008 > 

は、私はセットアップに私のテストを使用したコードは次のとおりです。

class Employee < ActiveRecord::Base 
    has_many :addresses, :inverse_of => :employee 
    has_one :badge, :inverse_of => :employee 

    accepts_nested_attributes_for :addresses 
    accepts_nested_attributes_for :badge 
    # validates_associated :addresses 

    def is_active? 
    active 
    end 
end 

class Address < ActiveRecord::Base 
    belongs_to :employee, :inverse_of => :addresses 

    validates :city, length: { within: 100..1000, message: "Too short"}, :if => lambda {|a| a.employee.is_active?} 
end 

class Badge < ActiveRecord::Base 
    belongs_to :employee, :inverse_of => :badge 

    validates :number, length: { within: 2..10, message: "Too long"}, :if => lambda {|b| b.employee.is_active?} 
end 
+0

の可能重複[ActiveRecordの:_of \逆に動作しませんが、持っている\ _many:を通じて作成に参加するモデル上](HTTP: //stackoverflow.com/questions/7436173/activerecord-inverse-of-does-not-work-on-has-many-through-on-the-join-model-on) –

答えて

4

はい、それはありません!アクティブレコードのアソシエーションのAPIドキュメントの双方向アソシエーションのセクションを参照してください:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

+3

"belongs_toの関連付けhas_manyの逆関連は無視されます" ??? – bdwain

+0

ええ、[これらのドキュメント](http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#label-Bi-directional+associations)が特に混乱していることがわかりました。この例では 'has_many:traps、inverse_of::dungeon'を示していますが、次の段落では:* belongs_to関連のhas_many逆関連は無視されます。 – dukedave

+0

直義の答えは正しいです。この回答は古いか間違っています。 – believesInSanta

5

いいえ、それはありません。 Rails Guideによると、

  • これらは連想では機能しません。
  • これらは多型関連では機能しません。
  • アソシエーションとしては機能しません。
  • belongs_toアソシエーションの場合、has_many逆アソシエーションは無視されます。
関連する問題