2

Rails 3.2 Web アプリを作成していますが、SQL クエリを作成するのに助けが必要です。私のアプリでは、ユーザー、プロジェクト、およびタスクを取得しました。ユーザーは、割り当てと呼ばれる結合テーブルを介してタスクに割り当てられます。

選択したユーザーが割り当てられているタスクを取得したすべてのプロジェクトのリストを取得する必要があります。

計画

has_many :tasks

仕事

has_many :assignments
has_many :users, :through => :assignments

ユーザー

has_many :assignments
has_many :tasks, :through => :assignments

割り当て

belongs_to :user
belongs_to :task

このクエリを最も効率的でベスト プラクティスな方法で作成するにはどうすればよいですか?

アップデート

これが私が最終的に解決した方法です:

def index
 tasks = current_user.tasks.joins(:project)
 @output = tasks.map{|task| task.project}.uniq 
end
4

2 に答える 2

2

:uniq最初に関連付けのオプションを指定しますhas_many。これにより、ユーザーに関連付けられたタスクの一意のリストが返されます。

# app/models/user.rb
has_many :tasks, :through => :assignments, :uniq => true

次に、タスクを繰り返し、すべての親プロジェクトの配列をコンパイルします。

tasks = User.first.tasks
projects = []

tasks.each do |task|
    projects << task.project
end

最後に、配列からすべての重複プロジェクトを削除します。

project.uniq! #=> array of `Project` objects
于 2013-06-10T08:27:07.737 に答える
0

タスクのリストの大きさに応じて (これは大きなリストでは非効率的です)、次のようにすることができます。

Project.where("id in (" + tasks.collect(&:project_id).join(",") + ")").uniq

これは、 tasks 内のタスクのプロジェクトを (重複なしで) 返します。

編集 - 500 人の子供の場合、この方法では 0.001977577 秒、上の方法では 0.799814631 秒かかりました (tasks.map 経由)。

于 2013-10-23T16:11:09.877 に答える