2015-03-02 4 views
0

Я пытаюсь установить область по умолчанию, так что пользователи, в которых notified: true будут удалены без проблем. notified - это булевский столбец данных.Почему не работает этот default_scope?

Это то, что я пробовал:

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

Но этот путь, ни один пользователь не появится в любом объеме. т.е. - все пользователи выглядят мягко-удаленными, даже те, которые с notified: false или notified: nil. Что случилось с моей областью?

+0

Можете ли вы показать нам код шляпа делает удаление слишком? –

+0

@TarynEast Ну, пользователи фактически не удаляются. Установка default_scope «soft» удаляет их, поэтому они больше не включены в запросы базы данных, но они все еще находятся в базе данных. Я не верю, что есть другой соответствующий код. –

+0

Да .. строка кода, которая фактически удаляет пользователей. Вы используете 'User.delete_all' или что? –

ответ

2

Я рекомендую использовать логические значения, которые понимает база данных. В этом случае, если вы хотите видеть пользователей, которые имеют уведомлен, что это не так, поэтому я бы пользователь:

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

Таким образом, пользователи будут появляться только в других областях, если их логические значения в базе данных является FALSE или NULL.

Примечание: области по умолчанию на самом деле считаются запахом кода ... потому что они немного волшебны и скрывают то, что вы на самом деле имеете в виду, когда вы выбираете пользователей. Вы можете вместо этого создать сферу active и inactive и указать их явно в коде, например:

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

# in your controller 
def index 
    @users = User.active.all 
end 
1

В соответствии с вашей целью «установить область по умолчанию, чтобы пользователи, в которых были уведомлены! = True, были удалены софт». Вы должны использовать default_scope { where(manual_down: true) }, который будет извлекать только записи с этим столбцом TRUE и игнорировать остальные (FALSE или NIL)

Я полностью согласен с Taryn East. Для изменения/удаления default_scope может потребоваться большая модификация логики, которая зависит от этой модели, поэтому используйте ее, только если вы уверены, что позже не измените условие default_scope (что обычно не так).

+0

О, это была ошибка с моей стороны. Я хотел сказать, что хочу мягко удалить пользователей, которые «уведомили: true». Как игнорировать записи, где столбец ИСТИНА? –

+0

Хм, ваша область действия должна работать так, как вы описываете. Вы уверены, что это тип данных типа boolean, а не тип данных String? Вы можете вставить результат 'User.unscoped.where (« notified is not null »). Map (&: notified) .uniq' –

+0

Да, это определенно логическое. 'User.unscoped.where (« notified is not null »)' просто распечатывает список всех соответствующих записей. –

Смежные вопросы