提问人:Daniel Costa 提问时间:10/31/2023 更新时间:11/3/2023 访问量:63
从模型属性而不是外键has_one
has_one from model attributes instead of foreign key
问:
我希望建立基于产品属性而不是其 ID 的关系。has_one
class Pricing
belongs_to :type
belongs_to :brand
validates :type_id, uniqueness: { scope: :brand_id }
end
class Product
belongs_to :type
belongs_to :brand
has_one :pricing # I need to indicate that the matching pricing is the one that has the same brand and type than my product.
end
在这种情况下,我们如何建立关系?has_one
答:
0赞
smathy
11/1/2023
#1
为这种情况添加 API 并没有真正的意义,Rails 代码中支持这种不寻常的要求所需的扭曲会使 99.9% 情况下的代码变得非常复杂。has_one
除了 getter 之外,你似乎不太可能想要其他任何东西,所以就自己写吧:
def pricing = Pricing.find_sole_by type: type, brand: brand
1赞
zaphodbln_
11/3/2023
#2
好的 - 从评论中总结一下,我理解您的逻辑数据模型如下:
产品<< - 商店中的产品
- 类型
- 品牌
- 价格<< - 向客户收取
定价<< - 可比新产品的参考
- 类型
- 品牌
- 参考价格
在这种情况下,您可以尝试使用 max 提到的复合键功能。因此,您可以尝试:
class Product
belongs_to :type
belongs_to :brand
has_one :pricing, query_constraints: [:type_id, :brand_id]
end
请注意,为此你需要 Rails 7.1。由于这是一项新功能,因此预计在下一个版本之一中会更改语法:)
但是,您可能需要重新考虑您的设计。根据我的理解,您可以将这两个实体结合起来:
产品
- 类型
- 品牌
- 价格<< - 向客户收取
- 新产品的参考价格<<-
或者,将 Brand 和 Type 分解为单个实体,并使用 through-option(https://guides.rubyonrails.org/association_basics.html#choosing-between-has-many-through-and-has-and-belongs-to-many --> 类似 has_one)
上一个:活动记录检查是否存在富文本
下一个:按包含字母和数字的属性排序
评论
price
brand
type
brand
type
Pricing
Product
Brand
Type
price
Brands
Types
price
Product
Pricing
Brand
Type
price