我需要在has_many关系中覆盖已失败的ActiveRecord生成的SQL查询。在rails 4中不推荐使用finder_sql。
在given legacy application中,客户与其可用折扣之间存在多种关系。看起来像这样:
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的假设。如何从查询中删除此信息?
答案 0 :(得分:0)
要覆盖Rails 4 has_many关系中默认生成的查询,我执行了以下操作:
has_many :discounts,
-> (cu) { unscope(:where).for_customer(cu) }
查找和使用的方法是unscope