1

例として、私はモデルグループとモデルユーザーを持っています

彼らは :has_many, :through => groups_users で接続されています

groups_users テーブルにはモデレーターと呼ばれる属性があり、ユーザーがグループのモデレーターであるかどうかを指定します

質問: 特定のグループのすべてのモデレーターにアクセスするにはどうすればよいですか?

:with_scope について読んだ後、頭に浮かぶのは

def find_moderators
 Group.with_scope(:find=>{:conditions => "moderator=1"})
   @moderators=@group.users
 end
end

ただし、Rails 2 以降、with_scope は保護され、コントローラーで特定のコードを使用できなくなります。

4

3 に答える 3

3

で解決

class Group
  has_many :groups_users
  has_many :moderatorships, :class_name => "GroupsUser",:conditions => {:moderator => true}
  has_many :moderators, :through => :moderatorships, :class_name => "User", :source => :user
end

@ group.moderatorsでユーザー情報を選択すると、これは1つのクエリしか生成しないため、Matt van Hornの回答よりも優先されますが、彼のソリューションでは、モデレーターごとに個別のクエリが提供されます。

編集:Sizzlepantsの質問に答えるために更新されました。このコードで作成されたモデレーターは、結合モデルのモデレーター属性をtrueに設定する必要があります(railsは結合モデルの作成中に:conditionsを使用します)。また、今すぐコーディングする必要がある場合は、読みやすくするためにgroups_usersメンバーシップに名前を付けます。

于 2009-08-18T07:52:01.320 に答える
0
class User
  has_many :group_users
  has_many :groups, :through => :groups_users
end

class GroupUser
  belongs_to :user
  belongs_to :group
  named_scope :as_moderator, :conditions => "moderator=1"
end

class Group
  has_many :group_users
  has_many :groups, :through => :groups_users
  def moderators
    group_users.as_moderator.map{|gu|gu.user}
  end
end

# use it:
@moderators = @group.moderators
or
@all_mods = Group.all.map{|g|g.moderators}.flatten
于 2009-08-17T14:28:29.160 に答える
-2

モンキーパッチ!

class Group < ActiveRecord::Base
   public :with_scope
end
于 2009-08-17T14:24:51.070 に答える