2017-08-16 3 views
2

私はレールから複雑なデータを取得しようとしています。Rails 5 - ANDの代わりにOR条件を使ってレコードを取得する方法

私が欲しいのは、すべてのユーザー、それらに関連付けられている特定のプロジェクトに限定されたタスクです。

は、ここで参照するタスクスキーマです:

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を持つ週の範囲内のすべてのタスクを見つけようとしています。

これは1つのクエリで可能ですか、より高度なロジックが必要ですか?

+0

@vijayおかげで起こっている正確に何であるように思わデータベースサーバー –

答えて

2

あなたは簡潔にするため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

幸いにも私はレール5を使用しているか、またはトリックをやっているようです:) 私は少しあなたの例では、私がこれまでに望むものを得ること。 (タスク:{start_date:タスクの開始時刻:終了時刻:{end_date:Date.today.beginning_of_week..Date.today.end_of_week})(User.includes(:tasks).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}) } 

希望します。乾杯!あなたがRailsの5を使用している場合

+0

でこれをタグ付けしてください、私のために働いてしまったものです!それは本質的に "と"ロジックをしたいとき "と"ロジックをしたい "とき ありがとう@Leo –

0

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}) } 
関連する問題