Rails after_create回调以更新不同的模型

时间:2017-05-30 21:52:58

标签: ruby-on-rails

我有用户,群组和会员资格。我使用成员资格连接表在用户和组之间建立了has_many through关系。我想要做的是设置一个after_create回调,只要用户创建一个新组,就会在会员表中添加一条新记录,这样创建者就会自动成为该组的成员。

现在,用户可以创建一个组,但该组将显示有0个成员,并且该用户必须加入该组。如果我尝试从组控制器更新成员资格模型,如何使用回调自动化该部分?

user.rb

class User < ApplicationRecord
  has_many :created_groups, class_name: "Group"
  has_many :memberships
  has_many :groups, through: :memberships
end

group.rb

class Group < ApplicationRecord 
  belongs_to :creator, class_name: "User"
  has_many :memberships
  has_many :users, through: :memberships
end

membership.rb

class Membership < ApplicationRecord
  belongs_to :user
  belongs_to :group
end

groups_controller.rb

class GroupsController < ApplicationController
  after_create :set_membership

  def create
    @group = current_user.groups.build(group_params)

    respond_to do |format|
      if @group.save
        format.html { redirect_to @group, notice: 'You have a new Group!' }
      else
        format.html { render :new }
      end
    end
  end

  private
    def set_membership
    end
end

set_membership部分是我完全迷失的地方。我只需要获取创建的组的id并使用它来创建新的成员资格(具有当前用户ID)。

1 个答案:

答案 0 :(得分:2)

我会将set_memberhsip移动到Group模型(active_create是模型回调,因此它不能在控制器中工作),并在那里创建Membership ,像这样:

class Group < ApplicationRecord
  after_create: set_membership

  belongs_to :creator, class_name: "User"
  has_many :memberships
  has_many :users, through: :memberships

  private
  def set_membership
    Membership.create!(user_id: user_id, group_id: id)
  end
end