2013-01-16 44 views
1

在Rails 3.2.1Rails的两个表的连接:我如何选择属性

有:

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,descriptionnum_alloc(来自SubProject模型)。

在控制器中,如果我做

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

@results包含子项目只有类的属性,因为SubProject.joins(...)返回SubProject对象吧?

那么我怎样才能返回一个对象的属性从两个模型? (?还有什么其他原因)

回答

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

如果您希望只使用一个对象,以避免多个SQL查询,你可以这样做:

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

然后,你可以做

@results.first.projects.name 

这不会触发新的SQL查询。

而且,如果你在你的子项目定义

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

然后添加一条线,你可以写:

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

所以你几乎从两个模型属性的对象,如你问。