2017-08-16 51 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}) } 
相關問題