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

id_nameRailsコントローラーで、「name」属性(Projectモデルから)と、descriptionおよびnum_alloc(SubProjectモデルから)を含むオブジェクトを返すにはどうすればよいですか。

コントローラーで、私が作るなら

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

@resultsSubProject.joins(...)オブジェクトを返すため、SubProject クラスの属性のみが含まれていますSubProjectよね?

では、2つのモデルから属性を持つオブジェクトを返すにはどうすればよいですか?

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 クエリを回避するために 1 つのオブジェクトのみを使用する場合 (他に理由はありますか?)、それを行うことができます。

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

それからあなたはすることができます

@results.first.projects.name

これは、新しい SQL クエリをトリガーしません。

さらに、SubProject 定義に 1 行追加すると、

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

次に、次のように記述できます。

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

あなたが尋ねたように、2つのモデルからの属性を持つオブジェクトが仮想的にあります。

于 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 に答える