#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
отличные варианты для вашего случая, обратитесь к этому замечательному сайту