Доступ к значениям в has_many: через таблицу соединений

StackOverflow https://stackoverflow.com/questions/2269857

Вопрос

У меня есть пользователи, которые являются членами групп через таблицу объединения участников, и одним из атрибутов этой таблицы объединения является «администратор».Я пытаюсь проверить представление участников группы, просматривая каждого участника, чтобы узнать, являются ли они администраторами.

В представлении я попробовал следующее:

for user in @group.users
  if user.administrator?
    ...DO STUFF
  end
end

Я также попробовал это в контроллере:

@administrators = @group.memberships.find(:all, :conditions => ["administrator = 1"])

Но не повезло.Есть предположения?

ОБНОВЛЕНИЕ. Как показано ниже, поместите метод в модель пользователя:

def is_administrator_of(group_id)
        Membership.find(:first, :conditions => ['user_id = ? AND group_id = ? AND administrator = ?', self[:id], group_id, true])
end
Это было полезно?

Решение

Хотя я думаю, что для этого вы могли бы настроить ассоциации, я думаю, что самый простой способ сделать это — добавить в вашу модель пользователя метод, который позволит вам проверять каждого пользователя (таким образом, он будет вписываться в предоставленный вами цикл).Я не знаю, получится ли это правильно, может потребоваться несколько быстрых изменений, но вы можете начать с чего-то вроде:

Модель пользователя

def is_administrator_of(group_id)
    Membership.find(:first, :conditions => ['user_id = ? AND group_id = ?', self[:id], group_id]).administrator == 1
end

Другие советы

Я думаю, что это будет более чистый способ сделать это

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, :through => :memberships
  has_many :admins, :through => :memberships, :source => :user,
           :conditions => ['memberships.administrator = ?', true] 
end

Теперь у вас есть список group.admins.

for user in @group.admins
    ...DO STUFF
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top