Да, default_scope
будет самым простым методом и позволит вам продолжать использовать такие вещи, как Post.find(:all)
, не беспокоясь об удаленных записях, но вы можете спросить себя, почему вы все равно храните удаленные записи. Вы бы потеряли что-нибудь ценное, просто удалив их? Если так, то может быть лучший ответ, чем «мягкое удаление». Например, проблема с программным удалением очень сильно противоречит практике и дает несколько советов, как их избежать.
Лично я ничего не имею против default_scope
, но это может запутаться, и в тех немногих случаях, когда я его использовал, мне всегда приходилось либо возвращаться и удалять его, либо ставить в уродливых with_exclusive_scope
вспомогательных методах в моей модели, чтобы явно обойти это.
Так что, хотя и не так просто, как Post.find(:all)
, я бы рекомендовал использовать named_scope
вместо
class Post < ActiveRecord::Base
named_scope :active, :conditions => {:deleted => 0}
end
, а затем с помощью Post.active.find(:all)
или Post.active.find(params[:id])
. Я думаю, что он более четко передает смысл кода, а затем позволяет вам переопределить, что является «активным» в будущем, если ваша бизнес-логика изменится, и не заставит вас перепрыгивать через with_exclusive_scope
обручей, если вы действительно этого хотите. получить Post.find(:all)
(например, в приложении администратора).
Редактировать : Как я и подозревал, похоже, вы уже ищете способы обойти это . :)
Редактировать 2 : Возможно, вы захотите взглянуть на камень acts_as_paranoid , который, похоже, управляет многими этими вещами для вас (но все же дает вам доступ к удаленным записям без использования with_exclusive_scope
).