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

Ruby on rails Rails从两个表连接:如何选择属性,ruby-on-rails,join,model,associations,rails-activerecord,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 :proje

在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
@results
只包含子项目类的属性,因为
SubProject.joins(…)
返回一个
SubProject
对象,对吗


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

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

@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")
@results = SubProject.includes(:projects).where(...)
那你就可以了

@results.first.projects.name
这不会触发新的SQL查询

此外,如果在子项目定义中添加一行

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

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

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

@results = SubProject.includes(:projects).where(...)
那你就可以了

@results.first.projects.name
这不会触发新的SQL查询

此外,如果在子项目定义中添加一行

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

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

我将从您的模型定义开始:您的
有许多关联需要在名称-
子项目->子项目中有下划线:

class Project < ActiveRecord::Base
 attr_accessible :name, :description
 has_many :sub_projects # !
end
进行这些更改后,您可以查询:

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

我将从您的模型定义开始:您的
有许多
关联需要在名称-
子项目->子项目中有下划线

class Project < ActiveRecord::Base
 attr_accessible :name, :description
 has_many :sub_projects # !
end
进行这些更改后,您可以查询:

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