【发布时间】:2021-12-12 05:51:56
【问题描述】:
在 Rails 中,如何创建过滤相关 has_one 属性的范围?我有两个模型,Patient 和 Appointment。 Patient 在Appointments 上声明has_many 关系。现在我添加了next_appointment 关系:
class Appointment < ActiveRecord::Base
end
class Patient < ActiveRecord::Base
has_many :appointments, class_name: "::Appointment", foreign_key: :patient_id, inverse_of: :patient
has_one(
:next_appointment,
-> { where("appointment_date >= now()").order(:appointment_date).limit(1) },
class_name: "::Appointment",
foreign_key: :patient_id
)
scope :by_range_next_appointment_date, lambda { |from, to|
where(...)
}
end
现在我想创建一个范围,返回在给定范围内进行下一次预约的所有患者。如何填写where() 来完成此操作?
这里有一个例子来说明:
假设布鲁斯·班纳的预约日期为 2021 年 11 月 2 日,彼得·帕克的预约日期为 2021 年 10 月 27 日和 2021 年 11 月 3 日。现在,我希望此范围返回下一次预约(截至 2021 年 10 月 26 日)的所有患者,该预约时间介于 2021 年 11 月 1 日和 201 年 11 月 7 日之间。这应该只返回布鲁斯班纳,因为他的下一次约会在那个范围内。彼得帕克的下一次约会是明天,所以他不应该被包括在内。
【问题讨论】:
-
下一个 - 你的意思是“下一个即将到来”吗?例如,假设我一周内有一个约会,三周内有另一个约会,那么我是否应该包含在
1.day.from_now..2.weeks.from.now的查询中? -
@max 是的,我的意思是“下一个即将到来”。所以在你的例子中,你应该被包括在内。但是,如果您明天有约会并且我过滤了
1.week.from_now..2.weeks.from.now,那么您将不会被包括在内。
标签: ruby-on-rails ruby model scope