Rails: получение данных из таблицы для каждой итерации цикла - PullRequest
28 голосов
/ 11 ноября 2008

У меня есть цикл (для элемента в @dataset), и я хочу на каждой итерации получать разные данные из другой таблицы и выполнять некоторые операции, которые будут напечатаны в представлении. Я не могу получить эти данные из набора данных, используемого в цикле.

Как я могу сделать это в соответствии с MVC? Я могу поместить код в цикл, в представлении, но я думаю, что это ужасно.

Должен ли я использовать для этого помощника и вызывать функцию из представления?

Заранее спасибо,

- ARemesal

Ответы [ 5 ]

46 голосов
/ 11 ноября 2008

Если у вас есть одна таблица и вы хотите получить данные из другой таблицы, обычно это происходит в случае отношения has_many. Например, у нас есть @people (Person модель), и каждый человек has_many адреса (Address модель). В этих случаях лучше всего это

# Controller
@people = Person.find(:all, :include => :addresses)
...

# View
@people.each do |p|
  p.addresses.each do |address|
    ...

Если ваши данные - это не просто обычные таблицы базы данных (возможно, вы получаете их из веб-службы и т. Д.), То хорошо бы заранее собрать все данные в контроллере и затем передать на вид. Как то так

# Controller
@people = Person.find(:all)
@people.each do |p|
  # attach loaded data to the person object in controller
  p.addresses = Address.load_from_somewhere_by_name(p.name)
...

Таким образом, код представления остается чистым, как это:

# View
@people.each do |p|
  p.addresses.each do |address|
    ...
1 голос
/ 28 июля 2011
Person(id, name, other fields...)
Event(id, title, ...)
Date(id, date, time, event_id, ...)
Disponibility(id, percent, date_id, person_id, ...)

Конечно, все отношения определены в модели.

У меня есть представление, которое показывает все даты события, это просто. Но я хочу для каждой даты распечатать данные для всех людей, которые доступны для этой даты. На мой взгляд, забыв про шаблон проектирования MVC, я мог бы написать что-то вроде этого:

<% for date in @Dates 
  available = Disponibility.find_by_date_id(date.id)
  for item in available
    guy = Person.find_by_id(item.person_id)
%>

Отображение даты и доступных людей ...

Я хочу избежать этого в представлении. Я думаю, что ответ Ориона Эдвардса является ближайшим для того, что мне нужно, но, в этом примере, адрес является пустым полем для таблицы Person? Или как я могу добавить новый атрибут в класс Person?

Хотя, я пропускаю какой-нибудь трюк SQL для этого?

1 голос
/ 11 ноября 2008

Если бы я был вами, я бы создал отдельный класс, который инкапсулирует набор данных и содержит всю логику, связанную с обработкой записей набора данных. Этот класс может быть повторяемым (отвечать на каждый). Затем я передаю экземпляр этого класса представлению и использую там только его методы.

1 голос
/ 11 ноября 2008

Трудно сказать о лучшем решении вашей проблемы без подробностей о данных и отношениях между вашими моделями (таблицами). Общая идея следующая: держите свои взгляды глупыми. Получите все данные, необходимые для визуализации представления внутри вашего действия контроллеров. Сделайте все изменения и расчеты внутри одного действия. Тогда в поле зрения используйте эти данные.

Кстати, если вы говорите о проблеме N + 1, тогда читайте больше о параметрах ActiveRecord 'include' и 'join'.

0 голосов
/ 11 ноября 2008
  • Сохраните всю логику вашего элемента @dataset внутри действия контроллера
  • Использование методов в ваших моделях для взаимодействия с другими необходимыми вам объектами модели
  • У вас должен остаться только @dataset для вашего представления, которое вы можете визуализировать частично.

Вам нужно было бы дополнительно объяснить вашу ситуацию, чтобы получить больше ответов на этот вопрос. С какими операциями и другими моделями вам нужно взаимодействовать? Если вы опубликуете свои модельные ассоциации, я уверен, что мы действительно сможем вас отбросить.

Удачи!

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