문제

예를 들어, 모델 그룹과 모델 사용자가 있습니다.

그들은 다음과 연결되어 있습니다 : 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 이후에 _scope가 보호되고 컨트롤러에 주어진 코드가 허용되지 않으므로 좋은 대안은 무엇입니까?

도움이 되었습니까?

해결책

해결되었습니다

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

Matt Van Horn의 답변을 선호합니다. @group.moderators로 사용자 정보를 선택할 때 단 하나의 쿼리 만 생성하기 때문에 그의 솔루션은 각 중재자에 대해 별도의 쿼리를 제공합니다.

편집 : SizzlePants의 질문에 답하기 위해 업데이트되었습니다. 이 코드로 생성 된 중재자에는 조인 모델에 중재자 속성이 있어야합니다 (Rails aude : 조건 조건 조건), 또한 지금 코딩 해야하는 경우 Groups_Users 멤버십 이름을 읽을 수 있습니다.

다른 팁

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

원숭이!

class Group < ActiveRecord::Base
   public :with_scope
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top