【问题标题】:How to override the query in has_many relationship如何覆盖 has_many 关系中的查询
【发布时间】:2023-04-06 02:19:01
【问题描述】:

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

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 的假设。我怎样才能把这个从查询中去掉?

【问题讨论】:

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


    【解决方案1】:

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

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

    查找和使用的方法是unscope

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多