0

我有三个由非 Rails 应用程序创建的表。以下模型只是表的关联。

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

您可以使用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 回答
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 回答