2010-04-16 2 views
0
class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, :through => :memberships 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 

    def moderators 
    # relationship_id is in the memberships table 
    self.users.find(:all, :conditions => ['relationship_id = ?', 1]) 
    end 
end 

위 코드를 사용하면 moderators 메서드를 구현하는 가장 좋은 방법입니까? 내 목표는 주어진 그룹 내에서 "중재자"관계를 가진 모든 사용자를 찾을 수있게하는 것입니다. 지금은 내가 조건을 충족하는 사용자의 하위 집합에 대한 부탁 해요 때문에 의미가 여기에 사용할 수있게 연관 확장을 고려인스턴스 메서드, named_scope 또는 연결 확장

# ... 
@group.moderators 

모든 사회자을 반복하는 방법을 사용할 수 있습니다. 그러나 중재자 인 사용자를 묻는 문법은 복잡해 보입니다.

# Association extension - seems redundant 
@group.users.moderators 

나는 named_scope로 생각했지만 오류없이 구현하는 방법을 알 수 없었습니다. 내가 할 수 있더라도 named_scope는 모든 그룹에서 모든 중재자를 반환하며 이는 내가 원하는 것이 아닙니다.

# named_scope: returns all the moderators across all the groups 
moderators = Group.moderators 

나는 여기에 가장 좋은 방법이 무엇인지 궁금하네요 그리고 왜 우리에게 좀 더 간결한 구문을 허용 주어진 인스턴스 방법을 통해 연결 확장 (또는 named_scope)를 할 수 있습니다?

답변

1

그룹 클래스에 연결을 추가

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, :through => :memberships 

    has_many :moderators, :source => :user, :through => :memberships, 
       :conditions => ['relationship_id = ?', 1] 
end 

는 이제 다음을 수행 할 수 있습니다

@group.moderators 
@group.moderators.size 
@group.moderators.find_by_city(..) 
+0

완벽! 나는 그것을 AWDWR에서 바로 읽고 그것을 깨닫지 못했다. 그 점을 주목 해 주셔서 감사합니다. 이 기능을 인스턴스 메소드를 사용하는 것과 기능적으로 동일하게 수행하고 있습니까? 아니면 조건부 연결을 추가하는 다른 이점이 있습니까? – caspyin

+0

인스턴스 메소드와 같지 않습니다. 사용자 클래스에 정의 된 연관 및 named_scope의 메소드를 연결할 수 있습니다. –