如何基于模型属性而非外键建立has_one关联?
如何基于模型属性而非外键建立has_one关联?
嗨,这个问题我刚好碰到过!要实现基于type和brand属性而非默认主键/外键的has_one关联,其实只需要在Rails的关联定义里加上动态条件就可以轻松搞定。
根据你的模型结构,直接修改Product模型的关联定义就行:
class Product < ApplicationRecord belongs_to :type belongs_to :brand # 用lambda动态匹配当前产品的type_id和brand_id has_one :pricing, ->(product) { where(type_id: product.type_id, brand_id: product.brand_id) } end
为什么这样可行?
- 这个lambda会接收当前的
product实例作为参数,生成查询时会自动带入该产品的type_id和brand_id作为筛选条件,精准匹配对应的Pricing记录。 - 你的
Pricing模型已经通过validates :type_id, uniqueness: { scope: :brand_id }确保了同一个type+brand组合只有一条定价记录,完全符合has_one关联对唯一性的要求。
如果需要从Pricing反向关联回Product,也可以用同样的逻辑:
class Pricing < ApplicationRecord belongs_to :type belongs_to :brand validates :type_id, uniqueness: { scope: :brand_id } has_one :product, ->(pricing) { where(type_id: pricing.type_id, brand_id: pricing.brand_id) } end
这样不管是调用product.pricing还是pricing.product,都能正确拿到对应的关联记录啦!
备注:内容来源于stack exchange,提问作者Daniel Costa
相关产品推荐
相关产品推荐

