如果群组创建者离开群组,群组创建者将转移给其他用户

group creator transfered to other user if group creator leaves group

第一个问题:我有一个小组模型belongs_to :creator, :class_name => "User",如果创建者离开,我希望小组中的其他人成为"creator"。我该怎么做?

作为第二个问题,我也想给离开的创作者在离开时选择新的创作者,或者让其自动分配。

截至目前,这些是我的模型的样子:

class Group < ActiveRecord::Base

  belongs_to :creator, :class_name => "User"

  has_many :members, :through => :memberships
  has_many :memberships, :foreign_key => "new_group_id"

和我的用户模型:

class User < ActiveRecord::Base

  has_many :groups, foreign_key: :creator_id

  has_many :memberships, foreign_key: :member_id
  has_many :new_groups, through: :memberships

作为第三个问题,我希望在创建者离开时将群组销毁。我该如何建立这种关系?

这是 3 个问题,前两个问题很开放,所以我会尝试回答所有问题,以便在未来做出一些假设。

第一题

这取决于您希望选择新 创作者 的行为是什么。是否要从当前 members 自动分配?您想让其他成员更改为自动指定自己为 creator 吗?在后者中,您需要为此目的向您的成员提供完整的 UI(路由、控制器、视图),因此我将向您展示如何编写第一个选项的代码。

首先,我将 group leaving 逻辑封装到 Group 模型上它自己的方法中,我们将在控制器中为此目的使用该方法。在 Group 上,我们将分配逻辑定义为新的 creator。这里的逻辑是传递方法 new_creator 如果我们有它,或者默认为第一个 members 如果没有给出。

class Group < ActiveRecord::Base
  def reassign(new_creator = nil)
    new_creator ||= members.first

    if new_creator
      self.creator = new_creator
      save
    else
      false
    end
  end
end

作为替代方法,您可以将此逻辑移动到 Observer (or any alternative) 中,它将在 Group 模型上观察属性 creator_id 是否为空。

第二题

这将涉及一个完整的 UI,您需要根据自己的规格自己弄清楚。简而言之,我会在您的 GroupsController 中为 members 创建一个新操作,以便像这样离开群组:

# config/routes.rb
resources :groups do
  member do 
    get :leave
    patch :reassign
  end
end

# app/controllers/groups_controller.rb
class GroupsController < ApplicationController
  def leave
    @group = Group.find(params[:id])
  end

  def reassign
    @group = Group.find(params[:id])
    if @group.reassign(params[:new_creator_id])
      redirect_to my_fancy_path
    else
      render :leave
    end 
  end
end

在您看来,您将 form_for @group 与新成员候选人(可能 select_tag :new_creator_id)和您喜欢的其他 UI。

第三题

这是最简单的。您只需像这样定义您的关联,您将在删除用户后销毁所有 User 组。

class User < ActiveRecord::Base
  has_many :groups, foreign_key: :creator_id, dependent: :destroy
end