Rails 5 - 如何使用OR条件而不是AND来获取记录

时间:2017-08-16 21:55:24

标签: ruby-on-rails activerecord ruby-on-rails-5

我试图从rails获取一段复杂的数据。

我想要的是所有用户,与他们相关的任务以及仅限于特定项目。

这里是参考的任务架构:

Cannot add or update a child row: a foreign key constraint fails (`database`.`#sql-45e3_695`, CONSTRAINT `FKfkqyncksuk5vuw09wam4sryyd` FOREIGN KEY (`profesor_id`) REFERENCES `profesor` (`id`))

我通过此次调用完成了部分内容

create_table "tasks", force: :cascade do |t|
t.date "start_date"
t.date "end_date"
t.integer "hours"
t.string "priority"
t.integer "project_id"
t.integer "user_id"
t.string "name"
t.string "description"

我的问题是我的查询没有正确地根据日期查找任务。

我正在尝试查找一周范围内的所有任务,这些任务在该周内具有start_date或end_date。

这可能在一个查询中,还是需要更高级的逻辑?

3 个答案:

答案 0 :(得分:2)

如果您使用的是Rails 5,则可以使用or method

User.joins(:tasks).where(tasks: {end_date: Date.today.beginning_of_week..Date.today.end_of_week})
    .or(
         User.joins(:tasks).where(tasks: {start_date: Date.today.beginning_of_week..Date.today.end_of_week})
        )

为了简洁起见,我没有将项目包括在内。

答案 1 :(得分:1)

我还没有对此进行过测试,但我认为发生的事情是你抓住所有用户使用end_date在给定时间之间发生的任务,然后查询每个用户执行start_date在给定时间之间发生任务的模型。仅向您提供其任务start_date和end_date在给定时间之间发生的用户。

users = User.includes(:tasks).where('((tasks.end_date BETWEEN ? AND ?) OR (tasks.start_date BETWEEN ? AND ?)) AND tasks.project_id = ?', Date.today.beginning_of_week, Date.today.end_of_week, Date.today.beginning_of_week, Date.today.end_of_week, @project.id).references(:tasks).map { |user| user.as_json.merge({tasks: user.tasks.as_json}) }

希望它有所帮助。干杯!

答案 2 :(得分:0)

这里有什么最终为我工作,谢谢@vijay

 User.includes(:tasks).where(tasks: {end_date:Date.today.beginning_of_week..Date.today.end_of_we‌​ek}).or(User.include‌​s(:tasks).where(task‌​s: {start_date: Date.today.beginning_of_week..Date.today.end_of_week})).wher‌​e('tasks.project_id = ?', @project.id).map { |user| user.as_json.merge({tasks: user.tasks.as_json}) }