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





Без подробностей о данных и связях между вашими моделями (таблицами) сложно сказать, как лучше всего решить вашу проблему. Общая идея следующая: держите свои взгляды глупыми. Получите все данные, необходимые для рендеринга представления внутри действия ваших контроллеров. Все изменения и расчеты производите в одном действии. Тогда имейте ввиду использовать эти данные.
кстати, если вы говорите о проблеме N + 1, прочитайте больше о параметрах ActiveRecord 'include' и 'joins'.
Вам нужно будет подробнее объяснить свою ситуацию, чтобы получить еще какой-либо ответ на этот вопрос. С какими операциями и другими моделями вам нужно взаимодействовать? Если вы опубликуете свои ассоциации с моделями, я уверен, что мы действительно сможем вас увести.
Удачи!
На вашем месте я бы создал отдельный класс, который инкапсулирует набор данных и содержит всю логику, участвующую в обработке записей набора данных. Этот класс может быть итеративным (отвечать каждому). Затем я передал бы экземпляр этого класса представлению и использовал бы там только его методы.
Если у вас есть одна таблица и вы хотите получить данные из другой таблицы, обычно это происходит в случае отношения 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|
...
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 для этого?
Думаю, это хорошее и красивое решение, но в данном случае оно слишком сложно для моих нужд. Аннотирую на будущее :)