使用 has_many 时如何收集多列
How to collect multiple columns when using has_many
在这个页面http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association,我想做Physician.first.appointments
或Physician.first.patients
那returns appointments.appointment_date AND patients.name 在相同的数据结构中并且 return 类型是 ActiveRecord::Relation,因为我想要在它后面链接更多方法。
我的问题是:我该怎么做?我可以用 joins
和 where
编写一个范围,但这不能满足我上述的要求。我需要重写某些方法吗?我在兔子洞里吗?
根据您的评论,这里有一个基本示例,说明您可以使用 ActiveRecord
做什么:
class Doctor
has_many :appointments
has_many :patients, through: :appointments
end
class Appointment
belongs_to :doctor
belongs_to :patient
end
class Patient
#...
end
@doctor = Doctor.includes(:appointments).first
@doctor.name #=> Dr Howdoyoudo
@doctor.appointments.each {|ap| puts ap.expected_at }
# OR
@doctor.appointments.map {|app| app.expected_at }
#=> [Wed, 04 Mar 2015 09:23:37 CET +01:00, Wed, 04 Mar 2015 09:23:37 CET +03:00]
Update :如果您也需要患者,则必须在 includes
中指定它(只是为了避免 O(n) 查询):
@doctor = Doctor.includes(appointments: :patient).first
@doctor.appointments.map do |app|
"#{app.patient.name} is expected at #{app.expected_at}"
end
ActiveRelation
可以在这里重复使用:
Doctor.includes(appointments: :patient).class #=> ActiveRelation
Doctor.includes(appointments: :patient).appointments.class #=> ActiveRelation
这只是一个开始!我建议你尽可能多地尝试,当你碰壁时再回来提出另一个问题。祝你好运!
在这个页面http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association,我想做Physician.first.appointments
或Physician.first.patients
那returns appointments.appointment_date AND patients.name 在相同的数据结构中并且 return 类型是 ActiveRecord::Relation,因为我想要在它后面链接更多方法。
我的问题是:我该怎么做?我可以用 joins
和 where
编写一个范围,但这不能满足我上述的要求。我需要重写某些方法吗?我在兔子洞里吗?
根据您的评论,这里有一个基本示例,说明您可以使用 ActiveRecord
做什么:
class Doctor
has_many :appointments
has_many :patients, through: :appointments
end
class Appointment
belongs_to :doctor
belongs_to :patient
end
class Patient
#...
end
@doctor = Doctor.includes(:appointments).first
@doctor.name #=> Dr Howdoyoudo
@doctor.appointments.each {|ap| puts ap.expected_at }
# OR
@doctor.appointments.map {|app| app.expected_at }
#=> [Wed, 04 Mar 2015 09:23:37 CET +01:00, Wed, 04 Mar 2015 09:23:37 CET +03:00]
Update :如果您也需要患者,则必须在 includes
中指定它(只是为了避免 O(n) 查询):
@doctor = Doctor.includes(appointments: :patient).first
@doctor.appointments.map do |app|
"#{app.patient.name} is expected at #{app.expected_at}"
end
ActiveRelation
可以在这里重复使用:
Doctor.includes(appointments: :patient).class #=> ActiveRelation
Doctor.includes(appointments: :patient).appointments.class #=> ActiveRelation
这只是一个开始!我建议你尽可能多地尝试,当你碰壁时再回来提出另一个问题。祝你好运!