我正在构建一个Rails 3.2 Web应用程序,我需要一些帮助才能构建一个SQL查询。 在我的应用程序中,我获得了用户,项目和任务。用户通过名为assignments的连接表分配给任务。
我需要获取所有项目的列表,这些项目包含所选用户所分配的任务。
项目
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
答案 0 :(得分: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
答案 1 :(得分:0)
根据您的任务列表的大小(这对于大型列表而言效率低),您可以这样做:
Project.where("id in (" + tasks.collect(&:project_id).join(",") + ")").uniq
这将返回任务中任务的项目(无重复项)。
编辑 - 对于500个孩子,这种方式花了0.001977577秒,上面的方式花了0.799814631秒(通过tasks.map)。