динамически устанавливается named_scope на основе current_user - PullRequest
0 голосов
/ 27 января 2010

Я получаю следующую ошибку:

У вас есть нулевой объект, когда вы этого не сделали ожидайте этого! Вы могли ожидать экземпляр массива. Произошла ошибка при оценке nil.size

Исходя из текущего пользователя, когда они переходят на страницу, я хочу ограничить их тем, что они могут видеть, основываясь на их сайте. Проблема в том, что нет прямой связи между сайтом и таблицей пользователей. Пользователь has_one контакта (информация о пользователе хранится в переменной current_user). На сайте есть много контактов. И на сайте has_many студентов, где таблица студентов имеет внешний ключ site_id. Таким образом, существует связь между учениками и сайтом, поэтому, когда текущий пользователь переходит на страницу учеников, он может видеть учеников только с того же сайта, что и они. Я могу сделать это путем жесткого кодирования числа в named_scope, чтобы отображать только студентов для сайта current_user. Но разные пользователи будут принадлежать разным сайтам, поэтому при входе в систему сайт, с которым они связаны, изменится. Вот в чем проблема - динамически установить это значение в named_scope. Вот что у меня есть:

StudentsController

def index_scoper
  if current_user.role_id == 8
    super.site_staff_limit while current_user[:site_id]
    # The problem is the user table has no site_id. There is no direct
    # link between the users table and sites table. However, there is
    # a link between users and contacts and then site and contacts and
    # then site and students, where students table has site_id.
  else
    super.with_state.with_site
  end
end

Модель студента

named_scope :site_staff_limit, lambda {|site_id| {:conditions => {:site_id => site_id}}}

Спасибо за любые предложения.

связь между таблицами:

пользователи: contact_id contact: первичный ключ, contactable_id, contactable_type сайт: первичный ключ студент: site_id

Модель пользователя принадлежат: контакт

Модель контакта has_one: пользователь own_to: contactable,: polymorphic => true,: зависимый =>: уничтожить

Модель сайта has_many: контакты,: как =>: контактный has_many: студенты

Студенческая модель принадлежат: сайт

Это успешно ограничивает студентов по сайту: StudentsController def index_scoper if current_user.role_id == 8 super.site_staff_limit еще super.with_state.with_site конец конец

Студенческая модель named_scope: site_staff_limit,: условие => {: site_id => 1}

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

1 Ответ

1 голос
/ 27 января 2010

Возможно, вы сможете установить связь между пользователями и сайтами, используя отношения: through.

Работает ли предоставленный вами код? Есть ли ошибка?

...