0

notified: trueユーザーが論理的に削除されるように、デフォルトのスコープを設定しようとしています。notifiedブール値のデータ列です。

これは私が試したことです:

class User < ActiveRecord::Base
  default_scope { where('notified != ?', true) }
  #...
end

ただし、この方法では、ユーザーはどのスコープにも表示されません。つまり、すべてのユーザーは論理的に削除されたように見えnotified: falseますnotified: nil。スコープの何が問題になっていますか?

4

2 に答える 2

2

データベースが理解できるブール値を使用することをお勧めします。この場合、真実ではない通知を受けたユーザーを確認したいので、次のようにします。

default_scope { where('notified IS NOT TRUE') }

そうすれば、ブール値のデータベース値がFALSEまたはである場合にのみ、ユーザーは他のスコープに表示されますNULL

注: デフォルトのスコープは、実際にはコードの匂いと見なされます...それらはちょっとした魔法であり、ユーザーを取得するときに本当に意味することを隠してしまうからです。代わりにactiveandinactiveスコープを作成し、コードで明示的に指定することもできます。

scope :active ->{ where('notified IS NOT TRUE') }
scope :inactive ->{ where('notified IS TRUE') }

# in your controller
def index
  @users = User.active.all
end
于 2015-03-02T00:41:51.080 に答える
1

「通知された != true のユーザーがソフト削除されるようにデフォルトのスコープを設定する」という目的に応じdefault_scope { where(manual_down: true) }て、その列が TRUE のレコードのみを取得し、その他 (FALSE または NIL) を無視する を使用する必要があります。

私はタリン・イーストに完全に同意します。default_scope を変更/削除するには、そのモデルに依存するロジックに多くの変更が必要になる場合があるため、後で default_scope 条件を変更しないことが確実な場合にのみ使用してください (通常はそうではありません)。

于 2015-03-02T00:41:42.653 に答える