7

既存のアプリの動作が変化し、大きな頭痛の種になっている状況があります。

私のアプリには写真があります。写真のステータスは次のとおり"batch", "queue", or "complete"です。アプリ内の既存の写真はすべて「完全」です。

99%の場合、完全な写真のみを表示する必要があります。既存のすべてのコードベースでは、Photosへのすべての呼び出しを完全な写真のみに制限する必要があります。

ただし、写真のアップロードと分類に関連する画面では、バッチまたはキューに入れられた写真を表示するために、そのデフォルトのスコープをかなり簡単にオーバーライドできる必要があります。

他の多くの人と同様に、特定の状況でデフォルトのスコープを簡単にオーバーライドする方法を見つける必要があります。私はこれらの質問(1、2)を調べましたが、探しているものに答えていないようです。

私が機能したいコードはこれです:

class Photo < ActiveRecord::Base
  ...
  default_scope where(:status=>'complete')
  scope :batch, unscoped.where(:status=>'batch')
  scope :queue, unscoped.where(:status=>'queue')
  ...
end

ただし、それは機能しません。スコープメソッドをラムダでラップしようとしましたが、それも機能しませんでした。

default_scopeには手荷物が付属していることに気付きましたが、オーバーライドで使用できない場合scope :complete ...は、既存のアプリの写真へのすべての呼び出しを追加して組み合わせ、.complete未処理の写真をフィルタリングするために追加する必要があります。

この問題をどのように解決しますか?

4

2 に答える 2

6

def self.batch
  Photo.unscoped.where(:status=>"batch")
end
このスレッドはより信頼できます: Railsdefault_scopeをオーバーライドします

于 2011-08-02T22:20:45.643 に答える
3

私はそれにショットを与えます。デフォルトのスコープからwhere句を削除し(別の値でオーバーライドするだけでなく)、関連付けを維持したいとします。これを試すことができます。

class Photo < ActiveRecord::Base
  default_scope where(:status => 'complete').where(:deleted_at => '').order('id desc')

  def self.without_default_status
    # Get the ActiveRecord::Relation with the default_scope applied.
    photos = scoped.with_default_scope
    # Find the where clause that matches the where clause we want to remove 
    # from the default scope and delete it.
    photos.where_values.delete_if { |query| query.to_sql == "\"photos\".\"status\" = 'complete'" }
    photos
  end

end
于 2013-03-20T18:39:34.077 に答える