2010-04-26 2 views
1

Мне нужно разработать систему отслеживания членства пользователей в группах с различными ролями (в настоящее время три).has_many: через значения по умолчанию

class Group < ActiveRecord::Base 
has_many :memberships 
has_many :users, :through => :memberships 
end 

class Role < ActiveRecord::Base 
has_many :memberships 
has_many :users, :through => :memberships 
end 

class Membership < ActiveRecord::Base 
belongs_to :user 
belongs_to :role 
belongs_to :group 
end 

class User < ActiveRecord::Base 
has_many :memberships 
has_many :groups, :through => :memberships 
end 

В идеале я хочу, чтобы просто установить

@group.users << @user 

и иметь членство имеют правильную роль. Я могу использовать: условия для выбора данных, вручную вставленные как таковой:

:conditions => ["memberships.role_id= ? ", Grouprole.find_by_name('user')] 

Но при создании членства в группе role_id не создаются.

Есть ли способ сделать это, поскольку в настоящее время у меня есть несколько повторяющийся фрагмент кода для каждой роли пользователя в моей модели группы.

ОБНОВЛЕНО

Следует отметить, что идентификатор идеально походит, чтобы достичь нечто похожее на

@group.admins << @user 
@group.moderators << @user 

это создало бы членство в группе и установить роль членства (ROLE_ID) соответствующим образом.

+0

Что такое Grouprole? –

+0

Извините, что я немного изменил свой код для публикации, я обновил опубликованные фрагменты. –

+0

не должны иметь пользователей 'has_many: role,: through =>: memberships'? – SztupY

ответ

0

Вы всегда можете добавить триггеры в свою модель членства для обработки назначений, подобных этому при их создании. Например:

class Membership < ActiveRecord::Base 
    before_save :assign_default_role 

protected 
    def assign_default_role 
    self.role = Role.find_by_name('user') 
    end 
end 

Это всего лишь адаптация вашего примера.

+0

К сожалению, учитывая вариации в ролях, это не сработало. Ive обновил мою первоначальную должность, чтобы включить некоторые дополнительные требования. –

+1

Вам нужно будет добавить условия с привязкой к этим отношениям, чтобы создание могло наследоваться из области. Использование динамических меток для ваших ролей, тем не менее, вызовет проблемы, если их придется постоянно решать. Определение фиксированных «кодов ролей» значительно упростило бы это. Для этого лучше использовать области хеш-стиля: {: role_id => Role :: USER_ROLE_CODE} – tadman

Смежные вопросы