Как использовать фильтр в модели

#ruby-on-rails

#ruby-on-rails

Вопрос:

Модель с именем Post, соответствующая таблице posts в БД. Post.find_within_4_days может получить мне сообщения за последние 4 дня. Вся моя следующая операция будет основана на сообщениях за последние 4 дня. Я бы хотел, чтобы он был отфильтрован или определен где-нибудь, поэтому я могу просто ссылаться на него, а не повторять Post.find_within_4_days везде. Что мне делать в Post-модели?

Ответ №1:

Предполагая, что вы используете Rails 3, вы могли бы использовать область имен, подобную этой:

 class Post < ActiveRecord::Base
  scope :within_4_days, where(# however you find your 4 day old posts #)
end
  

Затем вы могли бы использовать Post.within_4_days везде.

Если вам нужны только сообщения за последние 4 дня в любом месте, вместо этого вы можете настроить область по умолчанию:

 class Post < ActiveRecord::Base
  default_scope where(# however you find your 4 day old posts #)
end
  

после чего (например) Post.all будут возвращены только сообщения за последние 4 дня.

Ответ №2:

Еще более гибкий:

 class Post < ActiveRecord::Base
  scope :within, lambda { |time| where("created_at > ?", Time.zone.now - time }
end

Post.within(4.days)
  

Ответ №3:

default_scope и scope отличные варианты для вашего случая, обратитесь к этому замечательному сайту