0

В качестве примера у меня есть Доктора со многими Назначениями с Пациентами. Я хочу, чтобы получить все пациенты, которые в данный момент активны в назначении:Получить подмножество отношений «многие ко многим» в Rails/ActiveModel

class Doctor < ActiveRecord::Base 
    attr_accessible :name 
    has_many :appointments 
    has_many :patients, through: :appointments 
end 

И модель Назначение:

class Appointment < ActiveRecord::Base 
    attr_accessible :patient_id, :began_at, :finished_at, :doctor_id 
    belongs_to :patient 
    belongs_to :doctor 
    scope :active, where(finished_at: nil) 
end 

Теперь я могу сделать что-то вроде doctor.appointments.active, чтобы получить активные текущие назначения. Но я хочу, чтобы пациенты легко справились с этими назначениями. Есть ли способ сделать что-то вроде doctor.appointments.active.patients? Или у doctor.patients.active было бы больше смысла.

Могу ли я добавить область active в линию has_many :patients в классе Doctor?

ответ

1

Вы должны быть в состоянии сделать

has_many :patients, :through => :appointments do 
    def active 
    where("appointments.finished_at is NULL") 
    end 
end 

затем:

doctor.patients.active 
+0

это странно не работает. SQL, который он выводит, имеет смысл, но я возвращаю пустой набор, даже если назначение. Finished_at на самом деле 'nil' –

+0

Поле' finished_at' является 'nil' в Ruby. Однако, когда я перехожу к sqlite3, поле пусто. Я не знаю, что это такое. Если я делаю 'sqlite> select * из встреч, где finished_at = null;' я ничего не получаю. Даже если я делаю 'where finished_at = ''', я тоже ничего не получаю. –

+0

Если я набираю следующее в 'rails console', я вернусь к встрече, странно, как' nil' работает в Rails, но не в sqlite3: 'Appointment.where (finished_at: nil)' –

Смежные вопросы