Как переопределить запрос в отношении has_many - PullRequest
0 голосов
/ 22 ноября 2018

Мне нужно переопределить по умолчанию сгенерированный ActiveRecord SQL-запрос в отношении has_many.В то время как finder_sql устарел в Rails 4.

В данном унаследованном приложении существует множество отношений между клиентами и их доступными скидками.Выглядит это так:

data model

A 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 голосов
/ 22 ноября 2018

Чтобы переопределить сгенерированный по умолчанию запрос в отношении has_many в Rails 4, я сделал следующее:

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

Метод поиска и использования unscope

...