如何以has_many关系覆盖查询

时间:2018-11-22 09:34:05

标签: ruby-on-rails sql-server activerecord override

我需要在has_many关系中覆盖已失败的ActiveRecord生成的SQL查询。在rails 4中不推荐使用finder_sql。

given legacy application中,客户与其可用折扣之间存在多种关系。看起来像这样:

data model

Rails 4的折扣范围可获取给定客户的所有可用折扣:

scope :for_customer, lambda { |customer|
  where("CustomerNo = '#{customer.CustomerNo}'
      OR DiscountGrpCustNo = '#{customer.DiscountGrpCustNo}'
      OR PriceListNo = '#{customer.PriceListNo}'")
}

因此,我想使用此范围在客户上定义has_many。 我在以下另一个问题中找到了在has_many上使用变量的解释:https://stackoverflow.com/a/2462397/1062276

所以我尝试了:

has_many :discounts,
         -> (customer) { for_customer(customer) }

以下原因导致了Invalid column name 'customer_id'

> customer.discounts.to_sql
SELECT [KuraasAS].[DiscountAgreementCustomer].* FROM [KuraasAS].[DiscountAgreementCustomer] WHERE [KuraasAS].[DiscountAgreementCustomer].[customer_id] = 12345 AND (CustomerNo = '12345'
    OR DiscountGrpCustNo = '5'
    OR PriceListNo = '3')

customer_id列是Rails的假设。如何从查询中删除此信息?

1 个答案:

答案 0 :(得分:0)

要覆盖Rails 4 has_many关系中默认生成的查询,我执行了以下操作:

has_many :discounts,
         -> (cu) { unscope(:where).for_customer(cu) }

查找和使用的方法是unscope