Как использовать подвыбор с Ransack? - PullRequest
0 голосов
/ 04 июня 2019

(Я не уверен, что выбранное мной название подходит. Предложения приветствуются.)

Я не могу перечислить все записи пациента в моем индексном представлении вместе с другой информацией, поступающей изсвязанные таблицы.В частности, я не могу получить поле «Последующее наблюдение» без дублирования пациентов.Вот пример того, что я хочу получить (первые два поля взяты из таблицы пациентов, а поле 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.

...