Rails用户组 - 在另一个模型中设置组所有者

时间:2015-03-21 11:26:22

标签: ruby-on-rails has-many-through

我的应用程序中有用户创建的组。我很困惑如何设置创建组作为所有者的用户。我希望能够成为多个所有者,所以这是一个“有很多通过”的关系。我可以创建/编辑/删除一个组。

所以我的问题是如何在创建组时将当前的user_id和group_id插入group_owners表中?

到目前为止,这是我的工作:

用户模型

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable, :confirmable

  has_many :group_owners
  has_many :user_groups, through: :group_owners

end

群组模型

class UserGroup < ActiveRecord::Base

   has_many :goup_owners
   has_many :users, through: :groups_owners

   validates :name, presence: true, length: {minimum: 5}
   validates :visibility, presence: true, length: {minimum: 5}

   VISIBILITY_TYPES = ["Public", "Private"]

end

群组所有者模型

class GroupOwner < ActiveRecord::Base

   belongs_to :user
   belongs_to :user_group

end

用户组控制器 - 创建操作

def create
   @usergroup = UserGroup.new(usergroup_params)
   if @usergroup.save
     redirect_to user_groups_path
   else
     render 'new'
   end
end

我假设需要在用户组创建方法中进行某些操作,但我不确定是什么。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:0)

您应该创建像

这样的用户组
def create
 @usergroup = current_user.user_groups.build(usergroup_params)
 if @usergroup.save
   redirect_to user_groups_path
 else
  render 'new'
 end
end

这样,将使用当前用户ID和组ID在组所有者表中创建用户组。

答案 1 :(得分:0)

在您的UserGroup模型中,为所有者设置一个布尔值。

create_table |t|
  t.references :user
  t.references :group
  t.boolean :owner
end

class UserGroup < ActiveRecord::Base
  belongs_to :user
  belongs_to :owner

  scope :groups, ->(*g) {where(group_id: g.flatten.compact.uniq)}
  scope :users, ->(*u) { where(user_id: u.flatten.compact.uniq)}
  scope :owners, ->{where owner:true}
end

class User < ActiveRecord::Base
  has_many :user_groups, dependent: :destroy, inverse_of: user
  has_many :groups, through: :user_groups

  def owned_groups
    groups.merge(UserGroup.owners)
  end
end

答案 2 :(得分:0)

用户组控制器创建方法的以下更改修复了我的问题。

def create
    @user_group = current_user.user_groups.build(usergroup_params)
    if @user_group.save
      @user_group.users << current_user
      redirect_to user_groups_path
    else
      render 'new'
    end
end