Rails从两个表连接:如何选择属性

时间:2013-01-16 11:03:11

标签: ruby-on-rails join model associations rails-activerecord

在Rails 3.2.1中

我有:

class Project < ActiveRecord::Base
  attr_accessible :name, :description
  has_many :subprojects
end


class SubProject < ActiveRecord::Base
  attr_accessible :id_name, :description, :num_alloc, :project_id
  belongs_to :projects
end

如何在rails控制器,包含“name”属性(来自Project模型)和id_namedescriptionnum_alloc(来自SubProject)的对象中返回模型)。

在控制器中,如果我做

@results=  SubProject.joins('LEFT OUTER JOIN.......)

@results只包含SubProject类的属性,因为SubProject.joins(...)会返回SubProject个对象吗?

那么如何从两个模型中返回一个具有属性的对象?

3 个答案:

答案 0 :(得分:7)

@subproject = SubProject.select("subprojects.id_name, subprojects.description, subprojects.num_alloc, projects.name").joins("LEFT OUTER JOIN projects ON projects.id = sub_projetcs.project_id")

答案 1 :(得分:6)

如果您只想使用一个对象来避免多个SQL查询(还有其他原因?),您可以这样做:

@results = SubProject.includes(:projects).where(...)

然后你可以做

@results.first.projects.name

这不会触发新的SQL查询。

此外,如果在SubProject定义中添加一行

class SubProject < ActiveRecord::Base
  delegate :name, :to => :projects, :prefix => true
  ...
end

然后你可以写:

@results = SubProject.includes(:projects).where(...)
@results.first.projects_name

所以,你提出了几乎一个具有两个模型属性的对象。

答案 2 :(得分:2)

我会从您的模型定义开始:您的has_many关联需要在名称中加上下划线 - SubProject -> sub_project

class Project < ActiveRecord::Base
 attr_accessible :name, :description
 has_many :sub_projects # !
end

接下来,您的belongs_to需要采用单一形式:

class SubProject < ActiveRecord::Base
  attr_accessible :id_name, :description, :num_alloc, :project_id
  belongs_to :project # !
end

进行这些更改后,您可以查询:

@sub_projects = SubProject.includes(:project).all
name = @sub_projects.first.project.name
...