gpt4 book ai didi

ruby - inverse_of 是否适用于 has_many?

转载 作者:数据小太阳 更新时间:2023-10-29 07:13:04 24 4
gpt4 key购买 nike

当我使用 has_one 时,它​​工作得很好,但在 has_many 上却不行。在这里您可以看到 object_id 不同,因为它运行了另一个 SQL 来再次获取它。

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

最佳答案

不,不是。根据Rails Guide ,

  • 他们不与 :through 协会合作。
  • 它们不适用于:多态关联。
  • 他们不与 :as 协会合作。
  • 对于 belongs_to 关联,忽略 has_many 反向关联。

关于ruby - inverse_of 是否适用于 has_many?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com