Rails 3 - Нуждаете се от методи за споделен модел за полиморфни модели

В момента имам повторен код в множество модули нещо подобно:

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?


person Don Leatham    schedule 17.06.2012    source източник


Отговори (1)


Можете автоматично да включите модули lib/, като промените конфигурацията на приложението.

#config/application.rb

config.autoload_paths += %W(#{config.root}/lib)
person Salil    schedule 17.06.2012
comment
Благодаря @Salil. Това поправи проблема с включването на SharedMethods. Което от своя страна коригира другия проблем. Вече мога да извикам метода do_something_polymorphic() от всички различни типове обекти. Това прави всичко хубаво и СУХО! Благодаря отново. - person Don Leatham; 17.06.2012