2

モデル...

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

InternalUser新しいActiveRecordクエリAPIを使用して、「ADMIN」ロールを持つすべてのを見つけるにはどうすればよいですか?

つまり、このクエリを生成するにはどうすればよいですか...

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'
4

1 に答える 1

7

理想的には、管理者の役割であったオブジェクトから始める必要があります。

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
于 2012-04-14T01:04:39.913 に答える