Rails Has_many : Throun에서 조인 모델 속성 사용
-
18-09-2019 - |
문제
예를 들어, 모델 그룹과 모델 사용자가 있습니다.
그들은 다음과 연결되어 있습니다 : 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
제휴하지 않습니다 StackOverflow