从模型属性而不是外键has_one

has_one from model attributes instead of foreign key

提问人:Daniel Costa 提问时间:10/31/2023 更新时间:11/3/2023 访问量:63

问:

我希望建立基于产品属性而不是其 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

Ruby-on-Rails ActiveRecord 有-一

评论

0赞 zaphodbln_ 11/1/2023
你能详细说明一下你将要完成的任务吗?包含某些属性的数据模型的 scetch 可能很方便
0赞 Daniel Costa 11/2/2023
定价包含 for said 和 。产品有 a 和 a - 因此他的价格与匹配的价格相同pricebrandtypebrandtypePricing
1赞 zaphodbln_ 11/2/2023
但是,为什么这两个实体中都有品牌和类型呢?对我来说,这听起来不像是正确的规范化
0赞 max 11/2/2023
这听起来有点像你在钓鱼复合主键,这是一个非常新的轨道功能。但看起来你的数据库设计很糟糕,我也对这里的原因感到困惑。
0赞 Daniel Costa 11/3/2023
@zaphodbln_我不知道在这里该告诉你什么。我们有一个出售二手衣服的网店。A(现实生活中的衣服)有一个(耐克),一个(T恤)和一个属性。 并存储在自己的模型中。我们需要计算每个产品的价格,由于我们是一家二手商店,我们决定根据新产品价格的百分比来定价我们的产品。因此,我们引入了一种新模型,称为引用 a (Nike) 和 a (T-shirts),其属性表示新 Nike T 恤的中位数价格。ProductBrandTypepriceBrandsTypespriceProductPricingBrandTypeprice

答:

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)