Вы можете использовать default_scope
для этого:
class Club < ActiveRecord::Base
has_many :courses, conditions => {:approved => true}
default_scope :include => :courses
end
class Course < ActiveRecord::Base
default_scope :conditions => {:approved => true}
end
Теперь вы можете сделать это:
@club = Club.find(1) # this will eager load approved courses.
Ссылка:
Статья о default_scope
.
Примечание 1
Я изменил ассоциацию courses
в классе Club
, чтобы выбрать утвержденные курсы.Теоретически это не требуется, поскольку класс Course
имеет область действия по умолчанию.Но, похоже, область по умолчанию не применяется для загруженных запросов.
Примечание 2
Лично я бы не стал загружать Course
объекты через default_scope
.Выполнение этого через default_scope дает вам ненавязчивое решение по вашему желанию.
Я бы добавил предложение include
к вызову find
, чтобы загружать объекты Course
только тогда, когда это необходимо.
Примечание 3
@ Райан Бигг:
Райан Бейтс рассказывает о стандартных областях видимости на полпути этого своего экрана .Он приводит пример использования областей по умолчанию для исключения удаленных записей, т. Е.
default_scope :conditions => "delete_at IS NULL"
. Я считаю, что этот вариант использования аналогичен.Как я понимаю, основные операции над моделью курса выполняются на утвержденных записях, и default_scope
с опцией conditions
обеспечивает это.Чтобы переопределить область по умолчанию, пользователь может использовать метод with_exclusive_scope
.
Club.with_exclusive_scope{find(1)}