В момента имам повторен код в множество модули нещо подобно:
def do_something_polymorphic
self.something_polymorphic_able.where(.....).each do |thing|
...
end
end
В духа на DRY, опитах да преместя do_something_polymorphic()
в модул на /lib/shared_methods.rb
. Когато добавих include SharedMethods
в моите модели, получих грешка:
uninitialized constant Chapter::SharedMethods (NameError)
Което не можах да разбера как да заобиколя.
След това се опитах да заредя файла на модула в моделите (load 'shared_methods.rb'
). Зареди се добре, но конструкцията на модула изхвърли пространството от имена и do_something_polymorphic()
беше недефинирано за модела, в който беше зареден/включен. Така че „Модул“ изглежда не е опция, ако се опитвате да се самореферирате към обект.
И накрая, премахнах конструкцията на модула от файла shared_methods.rb и просто оставих метода do_something_polymorphic() сам във файла. Зареди се добре, но когато стартирах метода, получих грешката:
NoMethodError: private method `do_something_polymorphic' called for #<Polymorphic_Object:0x007fc27e5b8338>
Не съм сигурен накъде да отида от тук. Бих могъл да се върна към настройването на това като модул и да се опитам да предам „self“ като обектен параметър на метода, но бих искал да запазя способността за чисто извикване на метода срещу неговия обект: current_object.do_something_polymorphic
Освен преминаването по пътя на наследяването (което наистина искам да избегна), има ли начин да се сподели в множество модели метод, който използва ключовата дума self
?