我正在使用 Rails 4.2。我有以下用戶模型和幾個 has_many 關聯
class User < ActiveRecord::Base
…
has_many :roles, through: :roles_users
has_many :addresses, dependent: :destroy, as: :addressable, inverse_of: :addressable
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
has_many :roles_users
class RolesUser < ActiveRecord::Base
belongs_to :user
belongs_to :role
end
class Address < ActiveRecord::Base
belongs_to :addressable, polymorphic: true
alias :user :addressable
我想找到沒有任何地址的特定角色的所有用戶。我認為下面會做到
> users = User.includes(:roles, :addresses).where(:roles => {:name => 'User'}, :addresses => {:user_id => nil})
但是當我檢查結果時,我仍然得到帶有地址的結果......
2.7.1 :012 > users.last.addresses.count
…
=> 2
撰寫查詢這兩個 has_many 關聯的查找程式的正確方法是什么?
uj5u.com熱心網友回復:
檢查父 id 為零的子記錄就像在 Rails 4 中執行此操作的方式。但如果這不起作用,您可以使用 NOT IN 子句組合:
User
.where
.not(
id: User
.joins(:addresses, :roles)
.where(roles: { name: 'User' })
.select(:id)
)
它基本上是通過用戶 id 過濾掉所有具有關聯地址、角色且角色名稱正好是“用戶”的用戶行。您最終會得到這樣的 SQL 查詢:
SELECT "users".*
FROM "users"
WHERE "users"."id" NOT IN (
SELECT "users"."id"
FROM "users"
INNER JOIN "roles_users" ON "roles_users"."user_id" = "users"."id"
INNER JOIN "roles" ON "roles"."id" = "roles_users"."role_id"
WHERE "roles"."name" = 'User'
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/386796.html
