如何根据子记录获取父记录

时间:2013-06-10 08:11:45

标签: ruby-on-rails-3

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

2 个答案:

答案 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)。