Лучший подход MVC при передаче объектов в представление из контроллера? (Рельсы)

У меня есть три таблицы: User, Task и UserTask (в которых User и Task являются внешними ключами, других столбцов нет). Запись в таблице UserTask может существовать или не существовать для конкретной комбинации Пользователь/Задача (записи UserTask создаются по мере необходимости для обеспечения масштабируемости).

На мой взгляд, я хотел бы показать все задачи для текущего пользователя, вошедшего в систему. Для каждой задачи я хочу отображать текст «да», если соответствующая запись существует в таблице UserTask; в противном случае я хочу отобразить «нет». Но я немного не уверен, какие объекты я должен передать в представление из контроллера и как я должен взаимодействовать с объектами (т.е. что мне разрешено делать) после того, как они будут переданы в представление.

Должен ли я передавать пользователя, задачи и задачи пользователя как отдельные переменные из контроллера в представление? Таким образом, я могу показать все задачи, просто просматривая переменную Tasks, и для каждой задачи я могу использовать where (запрос ActiveRecord) в представлении, чтобы определить, существует ли UserTask для каждой задачи. Дело в том, можно ли выполнять запросы where и find к объекту, переданному в представление? Я всегда предполагал, что вы оставляете это контроллеру и делаете в представлении только простые вещи, например, итерацию по объектам, переданным в представление (поправьте меня, если это неправильно).

Или мне следует создать хэш в контроллере, где каждый ключ является задачей, а каждое значение — пользовательской задачей, а затем передать этот хэш в представление? Таким образом, я могу показать все задачи в представлении, просто перебирая все ключи, и для каждого ключа задачи я могу отображать «да» или «нет», проверяя, является ли значение нулевым или нет.

Или есть другой способ (например, объединение таблиц или что-то в этом роде... не знаю, как это будет работать)?


person XåpplI'-I0llwlg'I -    schedule 30.07.2012    source источник
comment
На самом деле, если вы будете следовать Model2 MVC или HMVC, представление должно извлекать информацию из уровня модели. Опять же... если бы вы действительно строго следовали шаблонам MVC, вы бы также не использовали (анти)шаблон активной записи.   -  person tereško    schedule 30.07.2012


Ответы (1)


Во-первых, вы должны действительно прочитать об ассоциациях в рельсах:

http://guides.rubyonrails.org/association_basics.html

То, как вы намереваетесь настроить отношения между пользователями и задачами, кажется мне немного странным, но если отложить это в сторону, чтобы реализовать его, как вы его описали, вы должны определить ассоциации в своих моделях User, Task и UserTask:

class User < ActiveRecord::Base
  has_many :user_tasks
end

class Task < ActiveRecord::Base
  has_one :user_task
end

class UserTask < ActiveRecord::Base
  belongs_to :user
  belongs_to :task
end

В вашем контроллере:

@user = User.includes(:user_tasks).find(...)
@tasks = Task.all

Затем, на ваш взгляд (в хамле):

[email protected] do |task|
  =(@user.user_tasks.include?(task)) ? "yes" : "no"

РЕДАКТИРОВАТЬ: Обновлено в соответствии с объяснением в комментариях.

person Chris Salzberg    schedule 30.07.2012
comment
В моем сценарии Задача не принадлежит Пользователю, и у Пользователя не так много Задач. Как это будет работать в таком случае? - person XåpplI'-I0llwlg'I -; 30.07.2012
comment
Я не понимаю, почему ты так поступаешь. Если вы хотите получить задачи, связанные с пользователем, у вас должна быть связь между двумя моделями. Что вы имеете в виду, что у пользователя не так много задач? - person Chris Salzberg; 30.07.2012
comment
О, кажется, я понимаю. То есть вы хотите перебрать все задачи и вывести yes, если задача связана с @user через UserTask, и никак иначе? - person Chris Salzberg; 30.07.2012