我不确定标题是否合理,但我有users
模型和schedule
模型。 user
has_many: schedules
和schedule
belongs_to: user
。
计划是具有日期,开始和结束时间的模型。基本上用户每次可用时都有许多计划对象(即如果他们在星期一早上5点到10点免费,对象将是{day: 0, start: 5, end: 10}
(0表示星期一,1星期二等)
我想查询(在任何给定时间的某一天)具有包含该小时的计划对象的所有用户。
Users.where(user.schedule.day: params[:day], user.schedule.start < params[:start], user.schedule.end > params[:end])
。
显然这不起作用,我无法弄清楚这种类型的查询是什么来寻找一个好的答案。
任何帮助表示赞赏!感谢。
答案 0 :(得分:1)
您可以尝试使用带字符串的where而不是hash,以便能够使用更大和更小的条件:
User.joins(:schedules).where('schedules.day = ? and schedules.start < ? and schedules.end > ?', params[:day], params[:start], params[:end])
joins
会将计划表加入查询。要访问日程表的列,您只需添加“日程表”。在列名称之前。 ?
由出现顺序的参数替换。
答案 1 :(得分:1)
# class Schedule
scope :for_day, ->(day) do
where(day: day)
end
scope :falls_during, ->(start_hour, end_hour) do
where("schedules.start > :start_hour", start_hour: start_hour).
where("schedules.end < :end_hour", end_hour: end_hour)
end
# class User
scope :for_schedule, ->(schedule) do
joins(:schedules).
merge(Schedule.for_day(schedule[:day])).
merge(Schedule.falls_during(schedule[:start], schedule[:end]))
end
像
一样把它们放在一起User.for_schedule(params)