【问题标题】:group creator transfered to other user if group creator leaves group如果组创建者离开组,则组创建者转移给其他用户
【发布时间】:2015-04-25 05:59:33
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails rails-activerecord has-and-belongs-to-many user-accounts


    【解决方案1】:

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

    第一个问题

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

    首先,我将组离开 逻辑封装到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(或 any alternative)中,该逻辑将在 Group 模型上观察到属性 creator_id 是否为空。

    第二个问题

    这将涉及一个完整的用户界面,您需要根据自己的规范自行确定。简而言之,我会在您的 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
    

    【讨论】:

    • 你完美地回答了我的问题。非常清晰易懂。谢谢
    • 很高兴知道!只要让我知道您是否可以将代码放入您的应用程序中。并且不要忘记投票/接受等等! ;)
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多