【问题标题】:How do I find records based on attributes of a many-to-many-related model?如何根据多对多相关模型的属性查找记录?
【发布时间】:2012-04-14 00:29:04
【问题描述】:

模型...

InternalUser
  has_many :internal_user_roles
  has_many :roles, :through => :internal_user_roles

InternalUserRole
  belongs_to :internal_user
  belongs_to :role

Role
  has_many :internal_user_roles
  has_many :internal_users, :through => :internal_user_roles

使用新的 ActiveRecord 查询 API,我如何找到所有具有“ADMIN”角色的 InternalUsers?

换句话说,我如何生成这个查询...

SELECT
  *
FROM
  internal_users i, internal_user_roles ir, roles r
WHERE
  i.id = ir.internal_user_id
AND
  r.id = ir.internal_user_id
AND
  r.name = 'ADMIN'

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord arel


    【解决方案1】:

    理想情况下,您应该从作为管理员角色的对象开始:

    role = Role.find_by_name('ADMIN')
    

    然后您可以简单地查询该角色的内部用户:

    role.internal_users
    

    如果你想更进一步,你应该注意 ActiveRecord 中的所有关联都可以进一步查询:

    role.internal_users.where(:first_name => 'Bill').limit(5)
    

    回到最初的问题,或者您可以查询 InternalUser 模型:

    InternalUser.includes(:roles).where(['roles.id = ?', role])
    

    或者可能更快一点,但代码更复杂:

    InternalUser.includes(:internal_user_roles).where(['internal_user_roles.role_id = ?', role])
    

    要直接翻译您的 SQL 查询,您也可以这样做:

    InternalUser.includes(:roles).where("roles.name = 'ADMIN'")
    

    您还可以通过在末尾添加“to_sql”调用来查看 ActiveRecord 将生成的 SQL(对于任何这些查询),如下所示:

    InternalUser.includes(:roles).where("roles.name = 'ADMIN'").to_sql
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多