2013-03-26 33 views
7

Có một số vấn đề với truy vấn has_many.Rails has_many thông qua truy vấn tùy thuộc vào thuộc tính bảng

Sử dụng ví dụ ở đây: http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association

class Physician < ActiveRecord::Base 
    has_many :appointments 
    has_many :patients, :through => :appointments 
end 

class Appointment < ActiveRecord::Base 
    belongs_to :physician 
    belongs_to :patient 
end 

class Patient < ActiveRecord::Base 
    has_many :appointments 
    has_many :physicians, :through => :appointments 
end 

Bảng Bổ nhiệm có một cột tên là appointment_date

Làm thế nào tôi sẽ nhận được tất cả các bệnh nhân từ một bác sĩ cụ thể mà có một cuộc hẹn vào một ngày cụ ?

Trả lời

13
Patient.includes(:physicians, :appointments).where('physicians.id = ? AND appointments.appointment_date = ?', <id or ids array>, Date.today) 

Trường hợp Date.today có thể được thay đổi với bất kỳ thứ gì và bác sĩ được chỉ định bởi id hoặc một mảng id.

Bạn cũng có thể làm:

physician = Physician.find(id) 
patients = physician.patients.includes(:appointments).where('appointments.appointment_date = ?', some_date) 

Edit:

Trong Rails 4 và chuyển tiếp, bạn cần phải thêm references(:appointments) với truy vấn để sử dụng các cuộc hẹn trong mệnh đề where.

+1

Tuyệt vời! Cảm ơn rất nhiều. – Ghar

+1

điều này đã không làm việc cho tôi trên đường ray 4, tôi đã dành khá nhiều thời gian tìm kiếm và tìm thấy [giải pháp này] (http://stackoverflow.com/questions/18799934/has-many-through-how-do-you -access-join-table-attributes) cho đường ray 4: –

+1

Yup, trong đường ray 4 bạn cần sử dụng 'tham chiếu' để tham khảo tên bảng từ bao gồm. – spullen

Các vấn đề liên quan