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

Rails User Groups - Set Group Owner In Another Model

我的应用程序中有用户创建的组。我对如何将创建组的用户设置为所有者感到困惑。我希望那里能够有多个所有者,所以这是一个 'has-many-through' 关系。我可以create/edit/delete一组。

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

以下是我目前有效的方法:

用户模型

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

我假设用户组创建方法需要一些东西,但我不确定是什么。

感谢您提供的任何帮助。

您应该像

那样创建用户组
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 添加到组所有者 table。

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

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

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

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