ユーザーはメンバーシップを通して多くのグループを持っています。グループには、メンバーシップを通して多くのユーザーがいます。グループに参加することは、基本的に2つのモデル間でメンバーシップを作成することです。グループから蹴ったことは、そのメンバーシップを削除することです。アクティブレコードには、多くのスルー、作成、削除の対称性があります。
もちろん、グループまたはユーザーが破壊された場合、対応するメンバーシップを破壊する必要があります。メンバーシップが作成され、破棄される「参加」と「キック」メソッドの作成には問題があります。
モデル/ 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
EDIT実行したときに、私はまったく同じ出力を得る:アイスマンの答え@
は正しいです。しかし、私はRailsコンソールのメソッドをテストしていました。たとえばu = User.find(1)
のようなデータベースオブジェクトが変換されると、u
は変換前のものと同じです。変更内容を確認するには、u.reload
を使用する必要があります。言い換えれば、彼の答えは完璧に機能しますが、間違ってテストしていました。
あなたの答えは精巧ですか?私は継承のために使用される '<<'を見ただけです – Carpetfizz
@Carpetfizz確かに、 '<<'は配列に項目を追加するために使用されます。 'user.groups + = group'だけでもいいかもしれません。 – Iceman
アップデートありがとうございます。あなたが提案した 'join'関数がうまくいくようです。私は 'user'が明示的に述べることなく' group'にどのように追加されるのか混乱しています。また、キックメソッドは機能しませんでした( 'u.groups'と' g.users')は対応するユーザとグループを表示します – Carpetfizz