2017-01-07 12 views
1

ユーザーはメンバーシップを通して多くのグループを持っています。グループには、メンバーシップを通して多くのユーザーがいます。グループに参加することは、基本的に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を使用する必要があります。言い換えれば、彼の答えは完璧に機能しますが、間違ってテストしていました。

答えて

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 
+0

あなたの答えは精巧ですか?私は継承のために使用される '<<'を見ただけです – Carpetfizz

+1

@Carpetfizz確かに、 '<<'は配列に項目を追加するために使用されます。 'user.groups + = group'だけでもいいかもしれません。 – Iceman

+0

アップデートありがとうございます。あなたが提案した 'join'関数がうまくいくようです。私は 'user'が明示的に述べることなく' group'にどのように追加されるのか混乱しています。また、キックメソッドは機能しませんでした( 'u.groups'と' g.users')は対応するユーザとグループを表示します – Carpetfizz

1

私は受け入れ答えが好きな配列に項目を追加するために使用されたと感じ、このようにそれを行うには良いでしょうが、私は考えていませんこれらのメソッドはMembershipモデルに属し、実際にUserモデルに移動する必要があります。

そうように私はまた、インスタンスメソッドにクラスメソッドからの切り替えになります。

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 

・ホープ、このことができます。それはあなたの方法がどこに住んでいるかによって異なります。

+0

ありがとうございます。これらのメソッドは実際にはGroupモデルに含まれていましたが、提案したようなUserモデルのインスタンスメソッドとしてそれらを追加する方が意味があると思います。 – Carpetfizz

関連する問題