Избегайте default_scope
, если возможно .
Я думаю, что вы действительно должны спросить себя, зачем вам нужен default_scope
. Противодействие default_scope
часто сложнее, чем оно стоит, и его следует использовать только в редких случаях. Кроме того, использование default_scope
не очень показательно, когда к билетным ассоциациям обращаются за пределами модели Ticket (например, "Я позвонил account.tickets
. Почему там нет моих билетов?" ). Это одна из причин, по которой with_exclusive_scope
защищен. Вы должны попробовать синтаксический уксус , когда вам нужно его использовать.
В качестве альтернативы используйте гем / плагин, такой как pacecar , который автоматически добавляет полезные named_scopes в ваши модели, предоставляя вам более понятный код повсюду. Например:
class Ticket < ActiveRecord::Base
include Pacecar
belongs_to :user
end
user.tickets.ends_at_in_future # returns all future tickets for the user
user.tickets # returns all tickets for the user
Вы также можете украсить свою модель пользователя, чтобы сделать приведенный выше код более чистым:
Class User < ActiveRecord::Base
has_many :tickets
def future_tickets
tickets.ends_at_in_future
end
end
user.future_tickets # returns all future tickets for the user
user.tickets # returns all tickets for the user
Примечание. Кроме того, рассмотрите возможность использования более идиоматического названия столбца даты-времени, например ends_at
вместо end_date
.