使用外键在实例上使用条件进行活动记录查询

时间:2018-01-19 15:42:33

标签: ruby-on-rails activerecord

我有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关系。

2 个答案:

答案 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,它将取决于数据库)。