Rails:查找实例的关系名称
Rails: find the relationship name of an instance
假设我们有这样的关系:
class Company < ActiveRecord::Base
has_one :company_address, class_name: 'Address', foreign_key: 'company_address_id'
has_one :overseas_address, class_name: 'Address', foreign_key: 'overseas_address_id'
end
如果我 pry
在 new 地址实例中,是否可以 return :company_address
或 :overseas_address
?
字段相同,但我想做不同的验证。
是的,有其他解决问题的方法,但我更感兴趣的是是否真的可以找到关系的名称。
谢谢!
你应该有相应的 belong_to: 在你的地址模型中,然后尝试 Address.reflect_on_all_associations(belongs_to)
它将 return 一个 ActiveRecord::Reflection::AssociationReflection
的集合,其中会有不同的 name
(取决于你的 belong_to)
为了检查实例,您应该将 belong_to 标记为 inverse_of: :put_corresponding_association
,将 has_one 标记为 inverse_of belong_to,然后您可以检查对应的方法(由 belong_tos 生成)存在父公司对象
这个想法是假设地址为
class Address < ActiveRecord::Base
belongs_to :company, class_name: 'Company', foreign_key: 'company_address_id', inverse_of: :company_address
belongs_to :oversea, class_name: 'Company', foreign_key: 'overseas_address_id', inverse_of: :overseas_address
end
class Company < ActiveRecord::Base
has_one :company_address, class_name: 'Address', foreign_key: 'company_address_id', inverse_of: :company
has_one :overseas_address, class_name: 'Address', foreign_key: 'overseas_address_id', inverse_of: :oversea
end
并且您将地址创建为 address = company.overseas_address.new
然后
address.company == nil
address.oversea == company
假设我们有这样的关系:
class Company < ActiveRecord::Base
has_one :company_address, class_name: 'Address', foreign_key: 'company_address_id'
has_one :overseas_address, class_name: 'Address', foreign_key: 'overseas_address_id'
end
如果我 pry
在 new 地址实例中,是否可以 return :company_address
或 :overseas_address
?
字段相同,但我想做不同的验证。
是的,有其他解决问题的方法,但我更感兴趣的是是否真的可以找到关系的名称。
谢谢!
你应该有相应的 belong_to: 在你的地址模型中,然后尝试 Address.reflect_on_all_associations(belongs_to)
它将 return 一个 ActiveRecord::Reflection::AssociationReflection
的集合,其中会有不同的 name
(取决于你的 belong_to)
为了检查实例,您应该将 belong_to 标记为 inverse_of: :put_corresponding_association
,将 has_one 标记为 inverse_of belong_to,然后您可以检查对应的方法(由 belong_tos 生成)存在父公司对象
这个想法是假设地址为
class Address < ActiveRecord::Base
belongs_to :company, class_name: 'Company', foreign_key: 'company_address_id', inverse_of: :company_address
belongs_to :oversea, class_name: 'Company', foreign_key: 'overseas_address_id', inverse_of: :overseas_address
end
class Company < ActiveRecord::Base
has_one :company_address, class_name: 'Address', foreign_key: 'company_address_id', inverse_of: :company
has_one :overseas_address, class_name: 'Address', foreign_key: 'overseas_address_id', inverse_of: :oversea
end
并且您将地址创建为 address = company.overseas_address.new
然后
address.company == nil
address.oversea == company