Как получить доступ к ActiveRecord включает программно - PullRequest
0 голосов
/ 18 октября 2011

У меня есть RailR 3 ActiveRecord, который принадлежит_ двум различным ActiveRecords.Пример

class Animal < ActiveRecord::Base
   belongs_to: species
   belongs_to: zoo
...
end

, где таблица животных содержит разновидности видов, зооид, имени и описания, а таблицы видов с научным именем и зоопарком имеют адрес.

В контроллере у меня есть запрос

 @animals = Animal.includes(:species, :zoo).order(:name)

и список столбцов, которые я хочу отобразить в представлении,

 @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>

, это прекрасно работает для имени и описания животных, но не работает для видов.scientific_name и zoo.address.

Я знаю, что мог бы в особом случае выполнить цикл и получить доступ к включенным классам напрямую, как animal.species ['Scientific_name'], но я надеялся, что будет способ получить доступ к включенным классам по имени.Что-то вроде животного ['разновидности'] ['научное_имя']

1 Ответ

2 голосов
/ 18 октября 2011

Подход 1

Обезьяна исправляет класс ActiveRecord.Обратитесь к этому ответу для получения подробной информации о патчировании 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)

Вид

<% @animals.each do |animal| %>
  <% @columns.each do |col| } %>
    <td><%= animal.read_nested(col)%></td>
  <% end %>
<% end %>

Подход 2

Добавить select Предложение для выбора столбцов и псевдонимов их.

@animals = Animal.includes(:species, :zoo).select("
    animals.*, 
    species.scientific_name AS scientific_name,
    zoos.address AS zoo_address").
  order(:name)

Теперь в вашем представлении вы можете получить доступ к таким атрибутам, как scientific_name, zoo_address, как к обычным атрибутам модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...