Если ваши области просты, вы, вероятно, хотите избежать дублирования кода. Мое решение позволяет вам вызывать model.active?
, чтобы узнать, принадлежит ли экземпляр к области, и Model.active
, чтобы найти все записи, соответствующие области. model.active?
не содержит запросов к базе данных.
рассмотрите возможность добавления этого к config/initializers/scope_and_method.rb
:
require 'active_record/named_scope'
module ActiveRecord::NamedScope::ClassMethods
def scope_and_method field, *values
field = field.to_sym
values.each do |value|
named_scope value.to_sym, :conditions => {field => value}
define_method "#{value}?" do
send(field.to_sym) == value
end
end
end
end
Использование:
scope_and_method :state, 'active', 'inactive'
Работает так, как если бы это было:
named_scope :active, :conditions => {:state => 'active'}
named_scope :inactive, :conditions => {:state => 'inactive'}
def active?
state == 'active'
end
def inactive?
state == 'inactive'
end
Это решение для Rails 2.3. Это требует очень небольшой настройки для Rails 3 и 4. (named_scope
-> scope
) Я скоро проверю.