用户通过会员资格拥有多个群组。群组通过会员资格拥有许多用户。加入组实际上是在两个模型之间创建成员资格。被团体踢出会删除该会员资格。
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
才能查看更改。换句话说,他的答案非常合适,但我测试的不正确。
答案 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
希望这会有所帮助。这一切都取决于你的方法在哪里。