사용자가 그룹의 소유자 인 경우 그룹 멤버십을 "파괴"할 때 그룹 소유권을 "파괴"할 수 있어야합니다. "사용자", "그룹 / Cliq"및 "그룹 / CliqMembership"모델이 있습니다. 사용자가 그룹을 만들면 해당 그룹의 "소유자"가됩니다. 그러면 다른 사용자가 그룹에 가입 할 수 있습니다. 사용자가 그룹에서 탈퇴하면 해당 사용자 및 그룹에 대한 멤버십 연결이 삭제됩니다. 그러나 소유자가 그룹을 탈퇴하면 "소유권"이 아닌 "구성원"만 제거됩니다. 쉬운 해결책이 있어야한다고 생각하지만 약간 갇혀 있습니다.
명확성을 위해 : Cliqs = 그룹; 문제는 소유권 연결과 회원 연결을 동시에 삭제하는 방법입니다. "소유자"가 그룹에서 탈퇴하면 "그룹 소유권"과 "그룹 멤버십"이 삭제되기를 원합니다. 제쳐두고 : "소유자"가 떠날 때 소유 그룹을 "종속 파괴"로 만들려면 어떻게해야합니까?
내 모델은 다음과 같습니다.
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의 그룹 소유권을 확인할 수 있습니다. 소유자가 그룹에서 탈퇴하면 모든 구성원과 함께 그룹도 자동으로 삭제되도록하는 구현을 원한다고 가정합니다. (내가 틀렸다면 정정하십시오.)이 경우 추가 할 수 있습니다 dependent: :destroy
.has_many :cliq_memberships
current_user가 소유자 인 경우 cliq를 완전히 파괴하면 cliq_membership도 파괴됩니다.
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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다