User
、、Activity
と呼ばれるモデルTask
があり、次のことができます
> puts Activity.joins(:task).to_sql
SELECT "activities".* FROM "activities" INNER JOIN "tasks" ON "tasks"."id" = "activities"."task_id" ORDER BY date DESC
> puts User.first.shared_tasks.to_sql
SELECT "tasks".* FROM "tasks" INNER JOIN "user_tasks" ON "tasks"."id" = "user_tasks"."task_id" WHERE "user_tasks"."user_id" = 1
しかし、merge
この2つを試してみると、配列が得られます。
> puts Activity.joins(:task).merge(User.first.shared_tasks).to_sql
NoMethodError: undefined method `to_sql' for []:Array
なぜそれが関係を返さないのですか?where句を付ける必要があります。
アップデート:
さらに詳しく調べUser.first.shared_tasks
てみると、一連のタスクがすぐに評価されているようです。order
呼び出しを追加することで、必要な動作を取得できます。
> puts Activity.joins(:task).merge(User.first.shared_tasks.order()).to_sql
SELECT "activities".* FROM "activities" INNER JOIN "tasks" ON "tasks"."id" = "activities"."task_id" INNER JOIN "user_tasks" ON "tasks"."id" = "user_tasks"."task_id" WHERE "user_tasks"."user_id" = 1 ORDER BY date DESC
空を追加する以外に、その関係が評価されないようにするためのより良い方法はありますorder
か?