Plugin - rozszerzanie modelu (RoR 2.0.2)

Witam, mam model DatabaseItem < (dziedziczy standardowo po ActiveRecord::Base). Stworzyłem sobie plugin. W init.rb daję require “costam”. W lib/costam.rb daję require “mojplugin/database_item”. W lib/mojplugin/database_item.rb mam kod mniej więcej tej postaci

[code]module Mojmodul
module InstanceMethods
def funkcja
“abc”
end
end
end

DatabaseItem.send(:include, MojModul::InstanceMethods)[/code]
I teraz w konsoli MOGĘ odwołać się np. do DatabaseItem.find(:first).funkcja
W kontrolerze piszę sobie (gdzie “item” to jakiś obiekt tej klasy)

item.send("funkcja")

i mi wywala, że takowej nie ma. Korzystam z send, bo w prawdziwym przypadku nazwa funkcji jest generowana. Zauważyłem, że pomaga dopisanie w kontrolerze

DatabaseItem.send(:include, MojModul::InstanceMethods)

wtedy widzi ją OK.

O co chodzi? Czemu dopisanie tego w skrypcie inicjalizowanym przy starcie aplikacji działa w konsoli a w kontrolerze nie?

Liczę na Waszą pomoc, bo trochę głupieję, nie mogę się doszukać, gdzie jest problem.

Problem wynika ze złej kolejności wywołania metody DatabaseItem.sent(:incluude, MojModul::InstanceMethods).
Prawdę powiedziawszy, to dziwię się, że to w ogóle działa (może błąd pluginu jest ignorowany?).

Problem dokładnie jest tej postaci - kiedy ładowany jest plik lib/mojplugin/database_item.rb klasa DatabaseItem jeszcze nie jest zdefiniowana (bo pluginy są ładowane przed kodem aplikacji), zatem DatabaseItem.send… nie powoduje oczekiwanego skutku.

Właściwa implementacja powinna wyglądać w ten sposób, że w swoim module tworzysz metody, która będzie dołączała odpowiedni pod-moduł w wybranych klasach, a cały moduł dołączasz do ActiveRecord::Base. Potem w pod-klasach AR, możesz wywoływać tę metodę, która dynamicznie dołączy odpowiednie metody (tak jak to ma miejsce np. w przypadku acts_as_taggable).

Dokładny przykład znajdziesz w moim tutorialu (p. dodawanie opcjonalnych własności)