Active Record有很多通过,创建和删除对称性

时间:2017-01-07 19:43:54

标签: ruby-on-rails activerecord

用户通过会员资格拥有多个群组。群组通过会员资格拥有许多用户。加入组实际上是在两个模型之间创建成员资格。被团体踢出会删除该会员资格。

class Group < ApplicationRecord
    has_many :memberships, dependent: :destroy
    has_many :users, through: :memberships

class User < ApplicationRecord
    has_many :memberships, dependent: :destroy
    has_many :groups, through: :memberships

class Membership < ApplicationRecord
  belongs_to :group
  belongs_to :user
end

当然,如果一个团体或用户被销毁,他们相应的会员资格应该被销毁。我在编写&#34;加入&#34;时遇到问题。并且&#34;踢&#34;创建和销毁成员资格的方法。

模型/ group.rb

def self.join(user, group)
    group.memberships.create(user: user)
end

def self.kick(user, group)
    group.memberships.where(user: user).first.destroy!
end

当我运行Group.join时,我得到:

2.4.0 :043 > g.memberships
 => #<ActiveRecord::Associations::CollectionProxy [#<Membership id: 3, group_id: 1, user_id: 1, created_at: "2017-01-07 19:32:47", updated_at: "2017-01-07 19:32:47", is_admin: nil>]> 
2.4.0 :044 > u.memberships
 => #<ActiveRecord::Associations::CollectionProxy []> 

所以会员资格属于该群组而不属于用户?

当我运行Group.kick

时,我得到了相同的输出

编辑:

@ Iceman的回答是正确的。但是,我正在Rails控制台中测试该方法。每当转换例如u = User.find(1)的数据库对象时,u与它转换之前的对象相同。您必须使用u.reload才能查看更改。换句话说,他的答案非常合适,但我测试的不正确。

2 个答案:

答案 0 :(得分:2)

最好这样做,我觉得

def self.join(user, group)
  user.groups << group
end

<<用于将项添加到数组

def self.kick(user, group)
  Membership.where(user_id: user.id, group_id: group.id).delete_all
end

答案 1 :(得分:1)

我喜欢接受的答案,但我不认为这些方法属于会员模型,应该真正转移到用户模型。

我也会从Class方法切换到实例方法,如下所示:

class User < ApplicationRecord

  def join(group)
    groups << group
  end

  def kick_from(group)
    memberships.where(group: group).delete_all
  end

现在你可以这样加入和踢:

group = Group.find(params[:id])
current_user.join group
current_user.kick_from group

希望这会有所帮助。这一切都取决于你的方法在哪里。