2

我正在构建一个 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
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 回答