使用has_many关系查询

时间:2015-02-26 23:27:45

标签: ruby-on-rails

我不确定标题是否合理,但我有users模型和schedule模型。 user has_many: schedulesschedule 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])

的某些内容

显然这不起作用,我无法弄清楚这种类型的查询是什么来寻找一个好的答案。

任何帮助表示赞赏!感谢。

2 个答案:

答案 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)