代码之家  ›  专栏  ›  技术社区  ›  Pavel K.

在Rails中使用连接模型属性有许多:到

  •  1
  • Pavel K.  · 技术社区  · 15 年前

    例如,我有一个模型组和模型用户

    它们与:has_many,:through=>groups_用户连接

    groups_users表有一个名为“版主”的属性,指定用户是否是该组的版主

    问题:如何访问给定组的所有版主?

    在阅读了以下内容后:使用示波器,我们想到的是

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

    但是,在Rails 2之后,with_scope就受到保护了,并且不允许在控制器中使用给定的代码,那么有什么好的替代方法呢?

    3 回复  |  直到 12 年前
        1
  •  3
  •   Pavel K.    12 年前

    用解决

    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.moderator s选择用户信息时,这个答案只产生一个查询,而他的解决方案为每个moderator提供单独的查询。

    编辑:更新以回答sizzlepants的问题。用此代码创建的版主在连接模型中应该将版主属性设置为true(Rails使用:创建连接模型时的条件),而且,如果现在必须对其进行编码,我将命名组\用户成员身份以提高可读性。

        2
  •  0
  •   Matt Van Horn    15 年前
    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
    
        3
  •  -2
  •   mcandre    15 年前

    蒙基补丁!

    class Group < ActiveRecord::Base
       public :with_scope
    end