Dokonując refaktoryzacji, stanąłem przed pewnym problemem. Mianowicie miałem już stworzony interfejs który chciałem wydzielić także do innej klasy. Problemem było to że klasy te mają różnych rodziców i nie chciałem tworzyć dla nich wspólnego potomka (a Ruby nie umożliwia wielodziedziczenia). Z pomocą przychodzą wtedy moduły.
Funkcjonalnością jaką chciałem wydzielić, było zarządzanie e-mailami. O ile dołączanie metod instancyjnych i klasowych nie stanowi problemu, o tyle dołączenie scope'a już tak.
Aby dołączyć scope'a z ActiveRecord do mixinu, w taki sposób aby działał w modelu, musimy posłużyć się metodą lambda. Rozszerzamy metodę included naszego modułu w taki sposób:
def self.included( k ) # Konta których email nie został aktywowany w przeciagu 24h k.scope :unactivated, lambda{where('email_change < ?', 24.hours.ago)} end
Nie jest to może "mega" ładne, jednak działa :)