Mam app Rails z kilku modeli o tej samej strukturze:Rozszerzanie klasy Ruby z samodzielny fragment kodu
class Item1 < ActiveRecord::Base
WIDTH = 100
HEIGHT = 100
has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
validates_attachment :image, :presence => true
end
class Item2 < ActiveRecord::Base
WIDTH = 200
HEIGHT = 200
has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
validates_attachment :image, :presence => true
end
Rzeczywisty kod jest bardziej skomplikowana, ale to wystarczy dla prostoty.
Myślę, że mogę umieścić wspólną część kodu w jednym miejscu, a następnie użyć go we wszystkich modelach.
Oto, co przychodzi mi na myśl:
class Item1 < ActiveRecord::Base
WIDTH = 100
HEIGHT = 100
extend CommonItem
end
module CommonItem
has_attached_file :image, styles: {original: "#{WIDTH}x#{HEIGHT}"}
validates_attachment :image, :presence => true
end
Oczywiście to nie działa z dwóch powodów:
CommonItem
nie ma pojęcia o metodach klasy modlę.- Styki są wyszukiwane w
CommonItem
zamiastItem1
.
Próbowałem użyć include
zamiast extend
, niektóre sposoby class_eval
i dziedziczenia klas, ale prace none.
Wygląda na to, że brakuje mi czegoś oczywistego. Proszę powiedz mi, co.
http://api.rubyonrails.org/ classes/ActiveSupport/Concern.html jest stworzony dla takich rzeczy. – jdoe