In Rails 3.1, angesichts dieses Modells:
class Subscripion < ActiveRecord::Base
scope :active, lambda {
where("start_date is not ? AND end_date >= ?", nil, Date.today)
}
def active?
self.class.active.exists?(self)
end
end
Bisher ist dies die trockenste Lösung, die mir eingefallen ist, weil sie die Bedingungen in der Datenbank nicht wiederholt. active?
Methode.
Allerdings gibt es zwei Nachteile:
- Bei einer Abonnementinstanz wäre keine Datenbankabfrage erforderlich, um festzustellen, ob sie aktiv ist. Wir können dies anhand ihrer Attribute überprüfen:
!start_date.nil? && end_date >= Date.today
. Die Aufforderung anexists?
führt zu einer zusätzlichen Datenbankabfrage. - Wenn die ursprüngliche Abonnementinstanz vor dem Aufruf von
exists?
über dieactive
Bereich ist das Ergebnis nicht das, was wir wollen, dennexists?
ignoriert die Instanz und fragt direkt die Datenbank ab.
Gibt es bessere Lösungen, bei denen die Bedingungen an einer Stelle definiert sind?