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 :)