1

在 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 控制器中返回一个包含“名称”属性(来自 Project 模型)和id_name, descriptionand num_alloc(来自 SubProject 模型)的对象。

在控制器中,如果我让

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

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

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

4

3 回答 3

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")
于 2013-01-16T11:16:48.910 回答
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

因此,正如您所要求的,您实际上有一个具有两个模型属性的对象。

于 2013-01-16T11:17:53.057 回答
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
...
于 2013-01-16T11:29:38.900 回答