【问题标题】:Rails: find the relationship name of an instanceRails:查找实例的关系名称
【发布时间】:2015-03-04 12:24:16
【问题描述】:

假设我们有这种关系:

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

如果我在 new 地址实例中pry,是否可以返回:company_address:overseas_address

字段相同,但我想做不同的验证。

是的,有解决问题的替代方法,但我更感兴趣的是找到关系名称是否真的可行。

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord relationship


    【解决方案1】:

    您的地址模型中应该有相应的belong_to:,然后尝试Address.reflect_on_all_associations(belongs_to) 它将返回ActiveRecord::Reflection::AssociationReflection 的集合,其中将有不同的name(取决于您的belong_to)

    为了检查实例,你应该将你的belong_tos标记为inverse_of: :put_corresponding_association,你的has_one标记为inverse_ofbelong_tos,然后你可以检查相应的方法(由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
    

    【讨论】:

    • viget.com/extend/… 这里有更多解释
    • 感谢您的回答。我看到这如何适用于数据库中的记录。但不是新实例?
    • 是的。我有 :inverse_of 属于我的。所以在我的地址中我可以查看相应的公司。但这并没有给我任何关于我当前正在与之交互的地址是标准地址还是海外地址的提示。两者都可以在创建公司时创建为嵌套属性。这有助于解释我的问题吗?再次感谢您的回复。
    • 我错过了你应该在你的 has_one 上镜像 inverse_of
    • 如何创建 Address 的实例?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多