У меня есть 2 модели с has_many
ассоциацией:
class Log < ActiveRecord::Base
has_many :log_details
end
и
class LogDetail < ActiveRecord::Base
belongs_to :log
end
Таблица Log
содержит строковый столбец action_type
. Таблица LogDetail
имеет 2 столбца: key
и value
, оба строковые, и ссылку на таблицу Log
с log_id
.
Я хочу написать 3 области на модели Log
, чтобы запросить некоторые детали, соединяя таблицу Log
с LogModel
дважды. Вот образец:
has_many :payment_gateways, -> {where(key: 'payment_gateway')}, class_name: 'LogDetail', foreign_key: :log_id
has_many :coupon_codes, -> {where(key: 'coupon_code')}, class_name: 'LogDetail', foreign_key: :log_id
scope :initiate_payment, -> {where(action_type: 'INITIATE PAYMENT')}
scope :payment_gateway, -> (pg) {joins(:payment_gateways).where(log_details: {value: pg}) unless pg.blank?}
scope :coupon_code, -> (cc) {joins(:coupon_codes).where(log_details: {value: cc}) unless cc.blank?}
Используя вышеуказанные области, если я пытаюсь запросить
Log.initiate_payment.payment_gateway('sample_pg').coupon_code('sample_cc')
Я получаю SQL-запрос:
SELECT
`logs`.*
FROM
`logs`
INNER JOIN
`log_details` ON `log_details`.`log_id` = `logs`.`id`
AND `log_details`.`key` = 'payment_gateway'
INNER JOIN
`log_details` `coupon_codes_logs` ON `coupon_codes_logs`.`log_id` = `logs`.`id`
AND `coupon_codes_logs`.`key` = 'coupon_code'
WHERE
`logs`.`action_type` = 'INITIATE PAYMENT'
AND `log_details`.`value` = 'sample_pg'
AND `log_details`.`value` = 'sample_cc'
вместо: (обратите внимание на разницу в последнем условии AND)
SELECT
`logs`.*
FROM
`logs`
INNER JOIN
`log_details` ON `log_details`.`log_id` = `logs`.`id`
AND `log_details`.`key` = 'payment_gateway'
INNER JOIN
`log_details` `coupon_codes_logs` ON `coupon_codes_logs`.`log_id` = `logs`.`id`
AND `coupon_codes_logs`.`key` = 'coupon_code'
WHERE
`logs`.`action_type` = 'INITIATE PAYMENT'
AND `log_details`.`value` = 'sample_pg'
AND `coupon_codes_logs`.`value` = 'sample_cc'
Первый запрос, поскольку он не разрешает ссылки на таблицы соединений должным образом, дает мне нулевые результаты.
Как я могу изменить свои области / модели таким образом, чтобы генерировать правильный запрос? Я думаю, что мне нужна ссылка на псевдоним соединительной таблицы в предложении where
, но я не уверен, как получить эту ссылку.