Доступ к значениям в has_many: через таблицу соединений - PullRequest
1 голос
/ 16 февраля 2010

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

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

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

Ответы [ 2 ]

2 голосов
/ 16 февраля 2010

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

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
1 голос
/ 16 февраля 2010

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

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

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