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

在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控制器中返回,该id_name包含“name”属性(来自Project模型)和id_namedescriptionnum_alloc (来自SubProject模型)。

在控制器中,如果我做

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

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

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

我将从你的模型定义开始:你的has_many关联需要在名称中有一个下划线 – SubProject -> sub_project

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

接下来,您的belongs_to需要采用单数forms:

 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 ... 
 @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") 

如果您只想使用一个对象来避免多个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 

所以你有几个具有两个模型属性的对象 ,就像你问的那样。