2017-08-16 50 views
2

我试图从rails中获取一个复杂的数据。Rails 5 - 如何获得OR条件而不是AND的记录

我想要的是所有用户,与它们相关联的任务,并且仅限于特定项目。

下面是引用任务模式:

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" 

我完成这部分与此调用

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

我的问题是,我查询没有找到基于任务在他们的日期正确。

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

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

+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}) 
     ) 

为简洁起见,用户,我没有将项目的where子句。

+1

幸运的是,我使用的Rails 5和或似乎是在做的伎俩:) 我不得不小心摆弄你的例子,但它似乎得到我想要的东西。 (:tasks):(任务:{end_date:Date.today.beginning_of_week..Date.today.end_of_week})或(User.includes(:tasks).where(tasks:{start_date: Date.today.beginning_of_week..Date.today.end_of_week}))。where('tasks.project_id =?',@project.id).map {| user | user.as_json.merge({tasks:user.tasks.as_json})}' 非常感谢 –

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}) } 

希望它有帮助。干杯!

+0

这似乎是到底发生了什么标记这个!这本质上是做“和”逻辑当我想要“或”逻辑 谢谢@Leo –

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}) } 
相关问题