gpt4 book ai didi

ruby-on-rails - 如何覆盖 has_many 关系中的查询

转载 作者:行者123 更新时间:2023-12-04 14:22:04 25 4
gpt4 key购买 nike

我需要在 has_many 关系中覆盖默认的 ActiveRecord 生成的 SQL 查询。虽然 finder_sql 在 Rails 4 中已弃用。

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) }

由于以下原因导致列名称“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

关于ruby-on-rails - 如何覆盖 has_many 关系中的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53427787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com