Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何以编程方式访问ActiveRecord includes_Ruby On Rails_Ruby_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails 如何以编程方式访问ActiveRecord includes

Ruby on rails 如何以编程方式访问ActiveRecord includes,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,我有一个Rails 3 ActiveRecord,它属于两个不同的ActiveRecords。范例 class Animal < ActiveRecord::Base belongs_to: species belongs_to: zoo ... end 以及我希望在视图中显示的列列表 @columns = ["name", "description", "species.scientific_name", "zoo.address"] 在视图中,我希望HTML表的创建由

我有一个Rails 3 ActiveRecord,它属于两个不同的ActiveRecords。范例

class Animal < ActiveRecord::Base
   belongs_to: species
   belongs_to: zoo
...
end
以及我希望在视图中显示的列列表

 @columns = ["name", "description", "species.scientific_name", "zoo.address"]
在视图中,我希望HTML表的创建由列名列表驱动,例如

<table>
  <tbody>
    <tr>
    <% @animals.each do |animal| %>
      <% %columns.each do |col| } %>
        <td><%= animal[</td>
      <% end %>
    <% end %>
    </tr>
  </tbody>
</table>
这对动物的名称和描述非常有效,但对物种。科学名称和动物园。地址不起作用

我知道我可以像animal.species['scientific_name']那样对循环进行特殊处理并直接访问包含的类,但我希望有一种方法可以通过名称访问包含的类。类似动物['species']['scientific_name']

方法1

猴子补丁ActiveRecord类。有关monkey patching AR类的详细信息,请参阅此

class ActiveRecord::Base
  def read_nested(attrs)
    attrs.split(".").reduce(self, &:send)
  end
end
嵌套属性访问示例:

animal.read_nested("zoos.address")
user.read_nested("contacts.first.credit_cards.first.name")
product.read_nested("industry.category.name")
对于您的用例:

控制器:

@columns = %w(name color zoo.address species.scientific_name)
看法


现在,在您的视图中,您可以访问科学名称、动物园地址等属性,如常规模型属性。

并不像我希望的那样灵活。相反,我对一些关键列进行了非规范化处理。@SteveWilhelm我添加了一种通用方法。看一看。
@columns = %w(name color zoo.address species.scientific_name)
<% @animals.each do |animal| %>
  <% @columns.each do |col| } %>
    <td><%= animal.read_nested(col)%></td>
  <% end %>
<% end %>
@animals = Animal.includes(:species, :zoo).select("
    animals.*, 
    species.scientific_name AS scientific_name,
    zoos.address AS zoo_address").
  order(:name)