【问题标题】:Rails way for querying join table in has_and_belongs_to_many在 has_and_belongs_to_many 中查询连接表的 Rails 方式
【发布时间】:2010-03-22 17:56:14
【问题描述】:

我有一个用户模型和一个具有 has_and_belongs_to_many 关系的角色模型。连接表是roles_users(两列——用户和角色的PK),没有对应的模型。

我想要一个方法来返回具有给定角色的所有用户。在 SQL 中类似于

SELECT u.id FROM role.r, roles_users ru WHERE r.role_id = #{role.id} AND r.role_id = ru.role_id

我看到 Rails 的 activerecord 有一个 find_by_sql 方法,但它只期望返回 一个结果。

什么是“Rails 方式”给我一个具有给定角色的用户列表,例如

def self.find_users_with_role(role)
  users = []
  users << # Some ActiveRecord magic or custom code here..?
end

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    我假设角色位于名为“角色”的表中。应该是这样的:

    User.all(:joins => :roles,
             :conditions => {:roles => {:id => role.id}})
    

    或者对于像您在上面展示的类方法解决方案,使用named scope

    named_scope :with_role, lambda { |role_id| { :joins => :roles, 
                                                 :conditions => {:roles => {:id => role_id} } } }
    # call it like so:
    User.with_role(role.id)
    

    这些是未经测试的示例,因此可能需要稍作调整。

    只有 ActiveRecord::Base#find 上的选项:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263

    注意 :joins 和 :includes 之间的区别。有一个 Railscast:http://railscasts.com/episodes/181-include-vs-joins

    【讨论】:

      【解决方案2】:

      一般情况下,HABTM 关联默认包含此方法!

      IE: 角色 has_and_belongs_to_many :users

      您只需为当前角色调用 users 方法:

      角色 = Role.last

      用户 = 角色.用户

      这都是 ORM 的魔法。不要发明你的自行车:)

      更多信息http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_and_belongs_to_many

      【讨论】:

        【解决方案3】:

        怎么样

            User.find(
              :all,
              :include => :roles,
              :conditions => ["roles.id = ?", role.id])
        

        【讨论】:

          【解决方案4】:

          更新:您提到的方法可以这样实现:

          def self.find_users_with_role(role)
            role.users
          end
          

          这很简单,只需两步即可完成:

          首先,找到您想要返回所有用户的角色。

          #Assume the role you want has the id of 3.
          role = Role.find(3)
          

          其次,查找与该角色关联的所有用户。

          all_users = role.users

          这假设您正确设置了 userrole 模型之间的关联以及关系 has_and_belongs_to_many

          class User < ActiveRecord::Base
            has_and_belongs_to_many :roles
          #More codes below
          end
          

          class Role < ApplicationRecord
            has_and_belongs_to_many :users
          end
          

          【讨论】:

            【解决方案5】:

            这也有效:

            users = Role.find(:all, conditions => ["id = ?", role_id]).map{ |role| role.users }
            

            【讨论】:

              猜你喜欢
              • 2011-05-21
              • 2018-06-29
              • 2010-10-21
              • 1970-01-01
              • 2013-10-14
              • 1970-01-01
              • 2011-09-02
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多