(Я не уверен, что выбранное мной название подходит. Предложения приветствуются.)
Я не могу перечислить все записи пациента в моем индексном представлении вместе с другой информацией, поступающей изсвязанные таблицы.В частности, я не могу получить поле «Последующее наблюдение» без дублирования пациентов.Вот пример того, что я хочу получить (первые два поля взяты из таблицы пациентов, а поле dt_date - из таблицы последующих действий):
|-----------------------------------|
|first_name last_name dt_date |
|-----------------------------------|
|john Doe 2011-11-01 |
|Mary Green 1999-06-03 |
|Mark Red 2009-05-07 |
|... |
|-----------------------------------|
Patient.rb: (работает, безdt_field)
class Patient < ApplicationRecord
has_many :followups, dependent: :destroy
scope :basic_info, -> {
self.left_joins(hospitalizations: :surgery)
.distinct
.select("patients.id,first_name,
last_name,
MAX(surgeries.surgery_date) as most_recent_surgery")
.group(:id, :first_name, :last_name)
}
end
followup.rb:
class Followup < ApplicationRecord
belongs_to :patient, inverse_of: :followups
end
followups_controller.rb:
@p = Patient.basic_info.ransack(params[:q])
@patients = @p.result.page(params[:page])
СейчасМне нужно отобразить поле следования "dt_date" в представлении индекса пациента, но если я присоединяюсь к таблице следования, я получаю дубликаты (которые мне не нужны):
scope :basic_info, -> {
self.left_joins(hospitalizations: :surgery)
.distinct
.select("patients.id,first_name,
last_name,
MAX(surgeries.surgery_date) as most_recent_surgery")
.left_joins(:followups)
.select("dt_date")
.group(:id, :first_name, :last_name, :dt_date)
}
результат:
|-----------------------------------|
|first_name last_name dt_date |
|-----------------------------------|
|john Doe 2011-11-01 |
|john Doe |
|Mary Green 1999-06-03 |
|Mark Red 2009-05-07 |
|... |
|-----------------------------------|
, следовательно, я попытался изменить код следующим образом:
scope :basic_info, -> {
self.left_joins(hospitalizations: :surgery)
.distinct
.select("patients.id,first_name,
last_name,
MAX(surgeries.surgery_date) as most_recent_surgery,
(select f.dt_date from followups f where f.dt_date is not null
and f.patient_id = patients.id ) as dt_date")
.group(:id, :first_name, :last_name, :dt_date)
}
, но я получаю ошибку MySQL, когда происходит разбиение на страницы Kaminari (ошибок нет, если отображается только одна страница):
Mysql2::Error: Unknown column 'dt_date' in 'field list': SELECT DISTINCT
COUNT(DISTINCT `patients`.`id`) AS count_id, `patients`.`id` AS patients_id,
`patients`.`first_name` AS patients_first_name, `patients`.`last_name` AS
patients_last_name, `dt_date` AS dt_date FROM `patients` LEFT OUTER JOIN
`hospitalizations` ON `hospitalizations`.`patient_id` = `patients`.`id`
LEFT OUTER JOIN `surgeries` ON `surgeries`.`hospitalization_id` =
`hospitalizations`.`id` GROUP BY `patients`.`id`,
`patients`.`first_name`, `patients`.`last_name`, `dt_date`
Кажется, что Ransack удаляет подвыбор (потому что ему не хватает Activerecord:Relation
, я полагаю)
Какой правильный код для решения этой проблемы?
Я использую Rails 5.0.2, Ransack и Kaminari.