2011-10-27 6 views
2

私はユーザー、メンバーシップ、グループモデルを持っています。ユーザーには多数のメンバーシップがあり、メンバーシップを通じてグループ化されます。グループには多数のメンバーシップがあり、ユーザーはメンバーシップを使用しています。メンバーシップは両方に属します。アクティブレコードクエリモデル 'select'と 'where'を使用した配列結果

ユーザーがユーザーのインデックスビューにアクセスすると、ユーザーが所属するグループに所属するすべてのユーザーを表示する必要があります。次のコードを作成しましたが、これは機能しません。私はクエリを動作させるように見えることはできません。ピーズヘルプ!

コンソールで試験したとき、私は、理由を理解していないユーザーモデル

def relevant_members 
    group_ids = self.group_ids 
    user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})") 
    User.find(user_ids) 
end 

、user_idsのUsersコントローラ

class UsersController < ApplicationController 

    def index 
     @users = current_user.relevant_members 
    end 

end 

コード内のコードは、IDの配列ではありませんしかし、次の配列:

[#<Membership user_id: 2>, #<Membership user_id: 2>, #<Membership user_id: 3>, #<Membership user_id: 3>, #<Membership user_id: 3>, #<Membership user_id: 2>] 

ユーザーIDの配列を返すより良い方法は?関連するすべてのグループメンバーを見つけますか?

答えて

3

Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})")

戻っメンバーオブジェクトの配列、選択( "user_idは")は、DBからオブジェクトにロードされるフィールドのみを変更します。

それはあなたが摘む()関数を試してみましたか?ID

user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})").map(&:user_id) 
0

あなたuser_idsがクラスMembershipの目的であるので、あなたはあなたがまた

user_ids = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})") 
    user_ids_array = user_ids.collect{|u| u.user_id} 
    User.find(user_ids_array) 

を、次のような何かを持っている「user_ids」を直接

の配列を得ることができないためですwhere節を次のように変更することができます。これはrubyの方が多くなります。

user_ids = Membership.select("user_id").where(["group_id IN (?)", group_ids]) 
1

Membership.select('user_id')それは、これまで正しいのです、ただuser_id属性でMembershipオブジェクトの配列を返します。あなたは結果からIDを抽出する場合、それは動作します:

membershipts = Membership.select("user_id").where("group_id IN (#{group_ids.join(", ")})") 
user_ids = memberships.map(&:user_id) 

敬具

トビアス常に

0
Membership.where("group_id in (#{groups.collect(&:id).join(',')})") 
    .all.collect(&:user_id)