0

非レール アプリケーションによって作成された 3 つのテーブルがあります。次のモデルは、テーブルの単なる関連付けです。

class Client < ActiveRecord::Base
  has_many :programs
  has_many :locations, :through => :programs
end

class Program < ActiveRecord::Base
  belongs_to :location
  belongs_to :client
end

class Location < ActiveRecord::Base
  has_many :programs
  has_many :clients, :through => :programs
end

クライアントの場所ごとにすべてのプログラムを一覧表示する簡単な方法が欲しいです。

次のコードは機能すると思いましたが、その場所のすべてのプログラムを返します。これは完全に理にかなっています。

@client.locations.each do |location|
  <h2>location.name</h2>
  <ul>
   location.programs.each do |program|
   <li>program.name</li>
  end
  </ul>
end

私は現在使用しています

@client.locations.each do |location|
      <h2>location.name</h2>
      <ul>
       Program.where(:location_id => location.id, :client_id => @client.id).each do |program|
       <li>program.name</li>
      end
      </ul>
    end

しかし、これは MVC の原則に反するものであり、醜いものです。

このコードをエレガントに書く方法がわからないので、ご意見をいただければ幸いです。

4

2 に答える 2

0

あなたはこれを行うことができます

@client.programs.each do |program|
  <h2>program.location.name</h2>
  <ul>
      <li>program.name</li>
    end
  </ul>
end
于 2013-10-23T20:21:49.617 に答える
0

メソッドを使用includesして、データを熱心にロードできます。また、この状況で include を使用すると、場所とクライアントの両方に関連するプログラムのみを取得する結合クエリが作成されます。

@client.locations.includes(:programs).each do |location|
  <h2>location.name</h2>
  <ul>
    location.programs.each do |program|
      <li>program.name</li>
    end
  </ul>
end

ただし、ビュー ファイルでデータベース クエリを使用することは避けてください。したがって@locations = @client.locations.includes(:programs)、コントローラーアクションに移動し@locations、ビューで使用して構造を維持できます。

于 2013-10-23T21:26:00.020 に答える