ruby-on-rails-3 - 如何根据子记录获取父记录

标签 ruby-on-rails-3

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

最佳答案

我首先会在 has_many 关联上指定 :uniq 选项,该选项应返回用户关联任务的唯一列表:

# 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

关于ruby-on-rails-3 - 如何根据子记录获取父记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17019474/

相关文章:

ruby-on-rails-3 - 如何使用之前的 Git check out 、在 Rails 3 中使用正确的文件和迁移干净地重新启动

jquery - 将jquery添加到rails中, "slider is not a function"

ruby-on-rails - 错误忽略 "gem name",因为它的扩展不是内置的 rails

ruby-on-rails - "bundle update"会更新系统上的所有 gem 还是只更新 Gemfile 中的 gem?

ruby-on-rails - 当使用延迟作业调用模型方法时,字符串值将转换为 Time 对象

ruby-on-rails - 设计:仅在某些情况下询问密码

ruby - 未定义方法 `[]' 为 nil :NilClass):

ruby-on-rails-3 - Rails 3.1 Assets 管道和手动订购的 Javascript 需要

ruby-on-rails-3 - Rails 仅在用户创建或更新时验证

ruby-on-rails - 在 Rails 3 中通过范围和关联保持 DRY