ruby-on-rails - 如何覆盖 has_many 关系中的查询
问题描述
我需要在 has_many 关系中覆盖默认 ActiveRecord 生成的 SQL 查询。虽然 finder_sql 在 Rails 4 中已弃用。
在给定的遗留应用程序中,客户与其可用折扣之间存在多种关系。它看起来像这样:
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 的假设。我怎样才能把这个从查询中取出来?
解决方案
要覆盖 Rails 4 has_many 关系中默认生成的查询,我执行了以下操作:
has_many :discounts,
-> (cu) { unscope(:where).for_customer(cu) }
查找和使用的方法是unscope
推荐阅读
- c# - C# - 使用 Bot Framework 的聊天机器人中的自动建议
- python - 将具有给定 2 列名称的文本文件作为输入进行比较
- javascript - React-apollo:更改变量而不在轮询查询中重新获取
- c# - 如何将BMP图像文件加载到Image控件的ImageSource中,内存占用少,性能好
- angular - 谷歌甘特图轴自定义 [标签和日期/时间]
- json - 使用接口解组json数据时出错?
- python - 使用数据读取器时出现 ImmediateDeprecationError
- scala - 如何在 Scala WorkSheet 和 Akka 中引用配置文件?
- c# - 从 IEnumerable 中的倒数第二个项目跳过
- ios - 设置 UILabel 的文本没有内存泄漏?