请求加入组 mvc

requesting membership to a group mvc

我有一个 has_many :members 和 has_many :memberships 的组模型。我想做的是,在 某些组 中,组的创建者会创建它,以便您必须申请成员资格才能加入该特定组。我如何在我的 rails 应用程序中进行设置?

我已经在成员资格 ActiveRecord 中添加了一个布尔字段,但我不知道如何以一种允许我加入不需要 "request a membership" 功能但也可以创建 "request a membership"函数。

截至目前,我的模型如下所示:

class Group < ActiveRecord::Base

  belongs_to :creator, :class_name => "User"

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

  has_many :events

end

class User < ActiveRecord::Base
  has_many :groups, foreign_key: :creator_id

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

class Membership < ActiveRecord::Base
  belongs_to :member, class_name: "User"
  belongs_to :new_group, class_name: "Group"
  validates :new_group_id, uniqueness: {scope: :member_id}

  has_many :accepted_memberships, -> {where(memberships: { approved: true}) }, :through => :memberships
  has_many :pending_memberships, -> {where(memberships: { approved: false}) }, :through => :memberships
end

还有我的会员控制人:

class MembershipsController < ApplicationController
  def create
    @group = Group.find(params[:new_group_id])
    @membership = current_user.memberships.build(:new_group_id => params[:new_group_id])
    if @membership.save
      flash[:notice] = "Joined #{@group.name} "

    else
      flash[:notice] = "You're already in this group"
    end
    redirect_to groups_url
  end

  def destroy
    @group = Group.find(params[:id])
    @membership = current_user.memberships.find_by(params[membership_id: @group.id]).destroy
    redirect_to groups_url

  end
end

我相信您已经非常接近您的解决方案,而且它更像是一个业务问题而不是技术问题。首先,我会向组中添加一个布尔值以指示需要批准。例如

rails generate migration add_require_approval_to_groups require_approval:boolean

这将在创建者首次创建组时设置,具体取决于他们创建的组的类型。

现在,用户必须能够以某种方式发现他们可以加入的群组,并且您需要向他们传达一种意识,即对于某些群组,成员资格不是自动的,但必须经过群组创建者。

因此,假设您已将此传达给用户,并且他们在一个带有选择框的页面上列出了他们可以成为其中成员的所有组(不一定是最佳设计选择,但会为这个例子做)。您需要在您的模型中有一个查询,该查询将收集用户仍然可以加入的所有可用组。

def self.available_groups(user_id)
 where("id not in (select group_id from group_members where user_id = ?)", user_id)
    .select("id, name")
    .collect{ |g| [g.name, g.id] }
end

在您的控制器中:

@available_groups = Group.available_groups(@current_user)

在您看来:

<h2>Please select the group to join:</h2>
<p>
    <%= form_tag :action => 'join_group' do %>
        <%= select("group", "id",
            @available_groups) %>
        <%= submit_tag "Join" %>
    <% end %>
</p>

现在,当您在 membership_controller 中处理 "post" 时,您需要通知创建者有人正在尝试加入需要批准的组(可能是邮寄者)。如果未设置 require_approval 布尔值,则需要自动批准用户,以便他们可以立即访问该组。