1

私のアプリケーションでは、ユーザーがまだ実行していない次のタスクを実行します。私には3つのモデルがあります。多くのタスクがあると、多くのタスクを持っていてそれに属しているユーザーがいます。テーブルtasks_usersテーブルには、完了したすべてのタスクが含まれているため、実行する次のタスクを見つけるために複雑なクエリを作成する必要があります。

私は純粋なSQLで機能する2つのソリューションを考え出しましたが、それらをRailsに変換することはできません。それが、私が助けを必要としていることです。

SELECT * FROM `tasks`
WHERE `tasks`.`book_id` = @book_id
AND `tasks`.`id` NOT IN (
    SELECT `tasks_users`.`task_id`
    FROM `tasks_users`
    WHERE `tasks_users`.`user_id` = @user_id)
ORDER BY `task`.`date` ASC
LIMIT 1;

ネストされた選択なしでも同様に

SELECT *
FROM tasks
LEFT JOIN tasks_users
    ON tasks_users.tasks_id = task.id
    AND tasks_users.user_id = @user_id
WHERE tasks_users.task_id IS NULL
AND tasks.book_id = @book_id
LIMIT 1;

これは私がMetaWhereプラグインを使ってRailsで行ったことです

book.tasks.joins(:users.outer).where(:users => {:id => nil})

しかし、私は現在のユーザーをそこに連れて行く方法も理解できません、

助けてくれてありがとう!

4

2 に答える 2

1

これは、LEFTJOINで2番目のフォームを複製すると思います。

class Task < ActiveRecord::Base
  scope :next_task, lambda { |book,user| book.tasks.\
    joins("LEFT JOIN task_users ON task_users.task_id=tasks.id AND task_users.user_id=#{user.id}").\
    where(:tasks=>{:task_users=>{:task_id=>nil}}).\
    order("date DESC").limit(1) }
end

これの代わりに、結合モデルでより一般的なtasks_usersテーブル名を使用することに注意してください。task_userまた、次のように呼び出す必要があります。

Task.next_task(@book_id,@user_id)
于 2011-01-09T07:20:41.173 に答える
0
book.tasks.where("tasks.id not in (select task_id from tasks_users where user_id=?)", @user_id).first

これにより、現在のユーザーのtasks_usersにまだエントリがない最初のタスクが得られます。

于 2011-01-09T06:24:48.853 に答える