如果群组创建者离开群组,群组创建者将转移给其他用户
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
第一个问题:我有一个小组模型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