Получение ассоциаций списка из has_many: через вложенный has_many в рельсах

Простая проблема, которую я не могу понять.

Как получить список связанных элементов, которые связаны со списком элементов другого типа. Например, от Clinician has_many patients до care_group_assignments и patients has_many assessments. Я хочу, чтобы список patients дал мне список всех их assessments. @patients дает мне список patients; как мне получить их списки assessments? Я хочу, чтобы @assessments был списком всех assessments, связанных со всеми patients, связанными с данным clinician.

У меня есть отношения has_many :through между «Врачем» и «Пациентом» с объединенной моделью «CareGroupAssignment».

clinician.rb (упрощенный)

class Clinician < ActiveRecord::Base
    has_many :patients ,:through=> :care_group_assignments
    has_many :care_group_assignments, :dependent => :destroy
    has_many :assessments, :through => :patients

    belongs_to :user
    accepts_nested_attributes_for :user,  :allow_destroy => true
end

терпеливый.rb

class Patient < ActiveRecord::Base
    has_many :clinicians ,:through=> :care_group_assignments
    has_many :care_group_assignments

    has_many :assessments, dependent: :destroy

    belongs_to :user
    accepts_nested_attributes_for :user,  :allow_destroy => true
end

care_group_assignments.rb

class CareGroupAssignment < ActiveRecord::Base
    belongs_to :clinician
    belongs_to :patient
end

Я попытался использовать ответы из 4720492, 9408931 и 15256541.

Я пытаюсь получить список в ClinicianController:

def show
  @clinician = Clinician.find_by(id: params["id"])
  @patients = @clinician.patients
  @assessments = @patients.assessments.order("created_at desc")
end

current_clinician определяется в моем ApplicationController как:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  helper_method :current_user
  before_action :require_user
  helper_method :current_clinician
  before_action :require_clinician

  def current_user
    @current_user ||= User.find_by!(auth_token: cookies[:auth_token]) if cookies[:auth_token]
  end

  def require_user
    if current_user.nil?
      redirect_to new_session_path
    end
  end

  def current_clinician
    current_user.clinician
  end

  def require_clinician
    if current_clinician.nil?
      redirect_to new_session_path
    end
  end
end

Прямо сейчас я получаю NoMethodError in CliniciansController#show,

неопределенный метод `оценки' для #Patient:.....

Рельсы 4.1.8, рубин 2.2.1p85, PostgreSQL

Спасибо


person Skiapex    schedule 22.09.2015    source источник
comment
Можете ли вы описать, что вы хотите показать в @esas_assessments = @patients.assessments.order("created_at desc")?   -  person akbarbin    schedule 22.09.2015
comment
Я хочу, чтобы список patients дал мне список всех их assessments. @patients дает мне список пациентов; как мне получить их списки assessments? Я хочу, чтобы @assessments был списком всех assessments, связанных со всеми patients, связанными с данным clinician.   -  person Skiapex    schedule 22.09.2015


Ответы (3)


Вы пробовали @clinician.assessments? Вы должны быть в состоянии получить желаемые результаты с помощью магии AR и присоединиться к столам!

person David Meza    schedule 22.09.2015
comment
это сработало! благодаря. не могу поверить, что это было так просто - person Skiapex; 22.09.2015
comment
Без проблем! Для справки в будущем, когда у вас есть методы has_many/belongs_to, они становятся частью вызываемых методов модели. Например, для любого врача можно вызвать следующие методы в дополнение к атрибутам врача: Clinician.patients, Clinician.care_group_assignments, Clinician.assessments и Clinician.user. Active Record делает всю тяжелую работу (генерирует SQL-запросы) за вас! - person David Meza; 22.09.2015

Согласно вашей Patient модели, Patient has_many оценок, но в действии show вы используете:

@assessments = @patients.assessments.order("created_at desc")

Где @patients - список предметов модели Patient.

Вы должны реорганизовать свою логику там.

person Alexander Shlenchack    schedule 22.09.2015
comment
Как вы рекомендуете мне реорганизовать мою логику? Я хочу, чтобы список элементов дал мне список всех их подэлементов. @patients дает мне список пациентов; как мне получить их списки assessments? - person Skiapex; 22.09.2015
comment
Как минимум, вы должны использовать соединения, как в следующем ответе. - person Alexander Shlenchack; 22.09.2015

Попробуйте сделать это:

 @assessments = Assessment.joins(:patient => {:care_group_assignments => :clinician).where(["clinicians.id = ?", @clinician.id]).order("assessments.created_at desc")

Я надеюсь, что это поможет вам.

person akbarbin    schedule 22.09.2015
comment
возвращает ActiveRecord::ConfigurationError в Pages#home Association named 'clinician' was not found on Patient; perhaps you misspelled it? - person Skiapex; 22.09.2015