2016-12-01 23 views
3

は、私は2つのモデルがあります:join/eager_loadのdefault_scopeをunscopeする方法は?

class User 
    default_scope -> { where(deleted_at: nil) } 
end 

class Order 
    belongs_to :user 
end 

を私は削除か削除されたユーザーとの注文を取得したい:これらの作業の

Order.joins(:user).merge(User.unscoped) 
Order.joins(:user).merge(User.unscope(where: :deleted_at)) 
# SELECT "orders".* FROM "orders" 
# INNER JOIN "users" ON "users"."id" = "orders"."user_id" AND "users"."deleted_at" IS NULL 
# ORDER BY "orders"."id" DESC LIMIT 1 

Order.eager_load(:user).merge(User.unscoped) 
Order.eager_load(:user).merge(User.unscope(where: :deleted_at)) 
# SELECT "orders"."id" AS t0_r0, "orders"."user_id" AS t0_r1, 
# "users"."id" AS t1_r0, "users"."deleted_at" AS t1_r1 FROM "orders" 
# LEFT OUTER JOIN "users" ON "users"."id" = "orders"."user_id" AND "users"."deleted_at" IS NULL 
# ORDER BY "orders"."id" DESC LIMIT 1 

なし。

すべてのクエリは、 "AND"ユーザ "。" deleted_at "IS NULL"をjoin文に追加します。

私は協会のスコープを指定した場合、何も変わりません:予想通り

class Order 
    belongs_to :user, -> { unscoped } 
end 

しかし作品が含まれています

Order.includes(:user).merge(User.unscoped).last 
# SELECT "orders".* FROM "orders" ORDER BY "orders"."id" DESC LIMIT 1 
# SELECT "users".* FROM "users" WHERE "users"."id" = 1054 

は、どのように私はレールが参加中の関連付けをunscopeすることができますか?

答えて

1

このように試すことができます。これはRails 3では動作しますが、Rails 4についてはわかりません。

+0

:http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Default/ClassMethods.html #method-i-unscoped – lcguida

+0

ありがとうございました。しかし、もし私が複数の関係を持っていれば、それを複数回ラップする必要があります。私はそれが他の方法でやり遂げることができるのだろうか? – Anton

0

私はこの問題を手動で作成することでこの問題を解決しました。あなたのケースでは、それは次のようになります。あなたが見つけたことOrder.includes(:user).merge(User.unscoped)ソリューションは、少し立派に見えますが

Order.joins('INNER JOIN users ON users.id=orders.user_id') 

、あなたが本当に一つだけのクエリ

0

を持っている場合を除き、あなたが同じモデルに別の関連付けを定義することができます具体的に削除されたユーザーをターゲットにしてください:

この例では、act-as-paranoidを使用してソフト削除を処理すると仮定しています。

class Order 
    belongs_to :user 
    belongs_to :all_user, -> { with_deleted }, foreign_key: 'user_id' 
end 

次に選択武器:

Order.includes(:user).pluck(:email)  # Only non soft-deleted emails 
Order.includes(:all_user).pluck(:email) # All emails including where deleted_at is null 
それはまだ動作します

`` `

関連する問題