9

だから私は rails3_acts_as_paranoid gem を使っていて、 has_many :through アソシエーションでスコープを制御するのにいくつか問題があります。

例えば

# User.rb
acts_as_paranoid
has_many :folders
has_many :files, :through => :folders

-

# Folder.rb
acts_as_paranoid
belongs_to :user
has_many :files, :dependent => :destroy

-

# File.rb
acts_as_paranoid
belongs_to :files

ここで、users_controller.rb のどこかで、ユーザーに属するすべてのファイルが削除されているかどうか、および/または削除されたフォルダーに属しているかどうかを照会したいとしましょう。だから当然、私は次のようなことをすると仮定します

current_user.files.with_deleted

with_deletedメソッドは、files.deleted_at IS NULL

...しかし...カーテンの後ろで使用されるフォルダーのdefault_scopeは削除されません。したがって、まだfolders.deleted_at IS NULL条件があり、deleted_at が null でないフォルダーに属するファイルを取得できません。

私はacts_as_paranoidを使い続けたいと思っています.acts_as_paranoidは私のアプリの他のすべての場所で非常に便利であり、手動フィルタリングや.where_values配列の要素のポップアウトなどを行わないようにしています. しかし、複雑なスコープの処理や利用可能なメソッドについてはあまり知りません。

4

1 に答える 1

11

私の質問は反対票を投じられましたが、理由はわかりません。しかし、私は答えを見つけました:

has_many スルーの場合、私が抱えていた問題は、スルー モデル (この場合はフォルダー) のスコープを制御できないことでした。

あなたはこれを行うことができます

@myvar = Folder.unscoped { current_user.files.with_deleted } 

反対票を投じた人へ-理由を知りたいので、次回はより良い質問をすることができます. ありがとう!

于 2013-01-07T16:23:39.100 に答える