Как получить модель для указания обязательного условия? - PullRequest
0 голосов
/ 15 января 2010

В моей модели "Post.rb" я пытаюсь, чтобы он возвращал сообщения только в том случае, если удаленный столбец равен 0. Другими словами, когда пользователь удаляет сообщения, он не удаляет элемент из базы данных, но вместо этого получается удалено в 1. Поэтому, если я запустил Post.find (: all), я хочу, чтобы он автоматически добавил условие «удалено = '0'". Как мне поступить с моей моделью?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 января 2010

Да, 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).

2 голосов
/ 15 января 2010

Самый простой способ - добавить область по умолчанию для вашей модели Post.rb:

default_scope :conditions => {:deleted => 0}
1 голос
/ 15 января 2010

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

Класс Post {: удалено => 0 '} конец

...