开发者

has_many :through default values

开发者 https://www.devze.com 2022-12-28 09:36 出处:网络
I have a need to design a system to track users memberships to groups with varying roles (currently three).

I have a need to design a system to track users memberships to groups with varying roles (currently three).

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, :throug开发者_如何学Goh => :memberships
end

Ideally what I want is to simply set

@group.users << @user 

and have the membership have the correct role. I can use :conditions to select data that has been manually inserted as such :

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

But when creating the membership to the group the role_id is not being set.

Is there a way to do this as at present I have a somewhat repetitive piece of code for each user role in my Group model.

UPDATED

It should be noted what id ideally like to achieved is something similar to

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

This would create the membership to the group and set the membership role (role_id ) appropriately.


You can always add triggers in your Membership model to handle assignments like this as they are created. For instance:

class Membership < ActiveRecord::Base
  before_save :assign_default_role

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

This is just an adaptation of your example.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号