2017-05-30 82 views
1

我有用户,组和会员资格。我通过使用成员关系连接表在用户和组之间建立了has_many关系。我想要做的是设置一个after_create回调函数,当用户创建一个新组时,会在成员资格表中添加一条新记录,创建者自动成为该组的成员。Rails 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并使用它创建新的成员资格(使用当前用户标识)。

回答

2

我将移动set_memberhsipGroup模型(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 
+0

这工作,我只是不得不重新将current_user.id与id,因为我猜你不能在模型中调用current_user。用户ID在创建时会在组中设置,所以我可以使用它。 – ddonche

+0

你说得对,我只是更新了答案。虽然注意到我使用'user_id'(我猜你的意思是这个)而不是'id'(它有组ID)。 – Gerry

相关问题