我有2个型号:
class Product < ApplicationRecord
belongs_to :discount
end
Products表有几列,其中有一个整数:price_cents。
class Discount < ApplicationRecord
has_many :products
end
折扣表有几列,其中有一个浮点数:保存。
因此,我可以通过以下方式操纵产品价格:product_instance.price_cents和product_instance.discount.saving
现在我想得到价格&lt; PARAMS [:MAX_PRICE]。对于所有产品,是否适用折扣。我尝试了一些事情,我最后一次悲惨的尝试是:
Product.joins(:discount).where('price_cents <= ?', params[:max_price].to_i * 100 / (1 - (self.discounts.saving || 0)))
我不知道如何在涉及产品的ActiveRecord查询中达到discount.saving。
请注意我不希望使用@products.select { |product| ... }
或其他方法实现此目的,因为我正在从搜索表单链接查询。我需要保持ActiveRecord关系。
答案 0 :(得分:0)
我不知道如何在涉及产品的ActiveRecord查询中达到discount.saving。
当您加入折扣表时,您可以直接联系saving
- 只需使用“保存”一词:
Product
.joins(:discount)
.where("price_cents * (1 - saving) < ?", params[:max_price].to_i)
我不清楚max_price是以美分还是以美元计算,但您可以相应调整---重点是saving
可以在查询中直接引用为saving
。
请注意,joins
默认使用INNER JOIN
,因此您只能获得数据库中具有关联Discount
的产品。
答案 1 :(得分:0)
尝试下一步:
products_with_discount = Product.joins(:discount).where('(price_cents *(1 - discounts.saving)) <= ?', params[:max_price].to_i )
products_without_discount = Product.where.not(id:
products_with_discounts).where('price_cents < ?', param[:max_price].to_i)
products_with_discounts + products_without_discounts
这不是最好的解决方案(我也不确定语法和sql中的计算不正确,但我认为主要观点是明确的。)但它很简单(另一个使用LEFT OUTER JOIN
但它需要更复杂的sql,它将取决于数据库)。