Добавление условия поиска ко всем моделям активных записей в Rails - PullRequest
6 голосов
/ 25 августа 2009

Можно ли добавить условие поиска для всех моделей активных записей?

то есть я бы хотел этот запрос

ExampleModel.find :all, :conditions=> ["status = ?", "active"]

вести себя так же, как

ExampleModel.find :all

в каждой модели

Спасибо !!

Ответы [ 2 ]

17 голосов
/ 25 августа 2009

Вы можете использовать default_scope:

class ExampleModel < ActiveRecord::Base
  default_scope :conditions => ["status = ?", "active"]
end

Если вы хотите использовать это во всех своих моделях, вы можете использовать подкласс ActiveRecord::Base и использовать его во всех ваших моделях (вероятно, не очень хорошо работает с наследованием одной таблицы):

class MyModel < ActiveRecord::Base
  default_scope :conditions => ["status = ?", "active"]
end
class ExampleModel < MyModel
end

... или вы можете установить default_scope на ActiveRecord::Base (это может раздражать, если вы решите, что одна модель не должна иметь эту область по умолчанию):

class ActiveRecord::Base
  default_scope :conditions => ["status = ?", "active"]
end
class ExampleModel < ActiveRecord::Base
end

Как упомянуто klochner в комментарии, вы также можете рассмотреть возможность добавления named_scope к ActiveRecord::Base с именем active, например:

class ActiveRecord::Base
  named_scope :active, :conditions => ["status = ?", "active"]
end
class ExampleModel < ActiveRecord::Base
end
ExampleModel.active  # Return all active items.
0 голосов
/ 30 августа 2012

Обновление: named_scope было устарело / переименовано в Rails 3.1. Начиная с 3.2.8, новый метод называется <a href="http://apidock.com/rails/ActiveRecord/Scoping/Named/ClassMethods/scope" rel="nofollow">scope</a>, в котором вместо :conditions

используется метод where.

Старый:

named_scope :active, :conditions => ["status = ?", "active"]

Новое:

scope :active, where(:status => "active")

или

scope :active, where("status = ?", "active")
...