Rails - 销毁用户组中的 membership/ownership
Rails - destroying membership/ownership in user group
当我 "destroy" 一个组的成员身份时,如果用户是组的所有者,我需要能够 "destroy" 组所有权。我有 "User"、"Group/Cliq" 和 "Group/CliqMembership" 模型。当用户创建组时,他们就是组的 "owner"。然后其他用户可以加入该组。当用户离开组时,该用户和组的成员资格关联将被破坏。但是,当所有者离开组时,它只会删除 "membership" 而不会删除 "ownership"。我觉得应该有一个简单的解决方案,但我有点卡住了。
为清楚起见:Cliqs = 组;问题是:如何同时删除所有权关联和会员关联?当 "owner" 离开一个小组时,我希望它能摧毁他们的 "group ownership" 和他们的 "group membership"。顺便说一句:当 "owner" 离开时,我将如何创建拥有的组 "destroy dependent"?
这是我的模型:
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships
has_many :members, through: :cliq_memberships, source: :user
end
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end
class User < ActiveRecord::Base
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
.
.
.
end
还有我的控制器:
class CliqsController < ApplicationController
def show
@cliq = Cliq.find(params[:id])
end
def new
@cliq = Cliq.new(params[:id])
end
def create
@cliq = current_user.build_owned_cliq(cliq_params)
@cliq.members << current_user
if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end
def destroy
@cliq = current_user.owned_cliq.find(params[:id])
flash[:alert] = "Are you sure you want to delete your Cliq? Your Cliq and all of its associations will be permanently deleted."
@cliq.destroy
if @cliq.destroy
redirect_to current_user
flash[:notice] = "You deleted the Cliq."
else
redirect_to current_user
#set up error handler
flash[:notice] = "Failed to delete Cliq."
end
end
def cliq_params
params.require(:cliq).permit(:name, :cliq_id)
end
class CliqMembershipsController < ApplicationController
def show
end
def create
#Cliq or Cliq_ID?
@cliq = Cliq.find(params[:cliq])
@cliq_membership = current_user.cliq_memberships.build(cliq: @cliq)
@cliq.members << current_user
if @cliq_membership.save
flash[:notice] = "Joined #{@cliq.name}"
else
#Set up multiple error message handler for rejections/already a member
flash[:notice] = "Not able to join Cliq."
end
redirect_to cliq_url
end
def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])
@cliq_membership.destroy
if @cliq_membership.destroy
flash[:notice] = "You left the Cliq."
redirect_to user_path(current_user)
else
end
end
end
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@uploads = Upload.all
@cliq_memberships = CliqMembership.all
@cliqs = Cliq.all
end
end
在 CliqMemberships 控制器的销毁操作中,就在销毁 CliqMembership 之前,您可以检查 current_user 对组的所有权,就像检查 his/her 成员资格一样。我假设您想要一个实现,其中如果所有者离开该组,您希望该组连同其所有成员资格一起自动销毁。 (如果我错了,请纠正我。)在这种情况下,您可以将 dependent: :destroy
添加到 has_many :cliq_memberships
如果 current_user 恰好是所有者,您可以完全销毁 cliq,这反过来也会销毁它的 cliq_memberships。
您可以在 CliqMemershipsController 的销毁操作中这样做。
def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])
@cliq = @cliq_membership.cliq
if @cliq.owner == current_user
@cliq.destroy
flash[:notice] = "The Cliq is destroyed"
redirect_to user_path(current_user)
else
# destroy only the membership
flash[:notice] = "You left the Cliq."
redirect_to user_path(current_user)
end
end
当我 "destroy" 一个组的成员身份时,如果用户是组的所有者,我需要能够 "destroy" 组所有权。我有 "User"、"Group/Cliq" 和 "Group/CliqMembership" 模型。当用户创建组时,他们就是组的 "owner"。然后其他用户可以加入该组。当用户离开组时,该用户和组的成员资格关联将被破坏。但是,当所有者离开组时,它只会删除 "membership" 而不会删除 "ownership"。我觉得应该有一个简单的解决方案,但我有点卡住了。
为清楚起见:Cliqs = 组;问题是:如何同时删除所有权关联和会员关联?当 "owner" 离开一个小组时,我希望它能摧毁他们的 "group ownership" 和他们的 "group membership"。顺便说一句:当 "owner" 离开时,我将如何创建拥有的组 "destroy dependent"?
这是我的模型:
class Cliq < ActiveRecord::Base
belongs_to :owner, class_name: 'User'
has_many :cliq_memberships
has_many :members, through: :cliq_memberships, source: :user
end
class CliqMembership < ActiveRecord::Base
belongs_to :cliq
belongs_to :user
end
class User < ActiveRecord::Base
has_one :owned_cliq, foreign_key: 'owner_id', class_name: 'Cliq', dependent: :destroy
has_many :cliq_memberships
has_many :cliqs, through: :cliq_memberships
.
.
.
end
还有我的控制器:
class CliqsController < ApplicationController
def show
@cliq = Cliq.find(params[:id])
end
def new
@cliq = Cliq.new(params[:id])
end
def create
@cliq = current_user.build_owned_cliq(cliq_params)
@cliq.members << current_user
if @cliq.save
redirect_to current_user
else
redirect_to new_cliq_path
end
end
def destroy
@cliq = current_user.owned_cliq.find(params[:id])
flash[:alert] = "Are you sure you want to delete your Cliq? Your Cliq and all of its associations will be permanently deleted."
@cliq.destroy
if @cliq.destroy
redirect_to current_user
flash[:notice] = "You deleted the Cliq."
else
redirect_to current_user
#set up error handler
flash[:notice] = "Failed to delete Cliq."
end
end
def cliq_params
params.require(:cliq).permit(:name, :cliq_id)
end
class CliqMembershipsController < ApplicationController
def show
end
def create
#Cliq or Cliq_ID?
@cliq = Cliq.find(params[:cliq])
@cliq_membership = current_user.cliq_memberships.build(cliq: @cliq)
@cliq.members << current_user
if @cliq_membership.save
flash[:notice] = "Joined #{@cliq.name}"
else
#Set up multiple error message handler for rejections/already a member
flash[:notice] = "Not able to join Cliq."
end
redirect_to cliq_url
end
def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])
@cliq_membership.destroy
if @cliq_membership.destroy
flash[:notice] = "You left the Cliq."
redirect_to user_path(current_user)
else
end
end
end
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
@uploads = Upload.all
@cliq_memberships = CliqMembership.all
@cliqs = Cliq.all
end
end
在 CliqMemberships 控制器的销毁操作中,就在销毁 CliqMembership 之前,您可以检查 current_user 对组的所有权,就像检查 his/her 成员资格一样。我假设您想要一个实现,其中如果所有者离开该组,您希望该组连同其所有成员资格一起自动销毁。 (如果我错了,请纠正我。)在这种情况下,您可以将 dependent: :destroy
添加到 has_many :cliq_memberships
如果 current_user 恰好是所有者,您可以完全销毁 cliq,这反过来也会销毁它的 cliq_memberships。
您可以在 CliqMemershipsController 的销毁操作中这样做。
def destroy
@cliq_membership = current_user.cliq_memberships.find(params[:id])
@cliq = @cliq_membership.cliq
if @cliq.owner == current_user
@cliq.destroy
flash[:notice] = "The Cliq is destroyed"
redirect_to user_path(current_user)
else
# destroy only the membership
flash[:notice] = "You left the Cliq."
redirect_to user_path(current_user)
end
end