У меня есть модель, к которой я добавил пару вспомогательных методов. Очень надуманный пример:
class Post < ActiveRecord::Base
...
def permalink
"http://some_url.com/p/#{id}"
end
end
class Notification < ActiveRecord::Base
belongs_to :post
...
end
Кроме того, у меня есть очередь Resque, которую я использую для обработки заданий в автономном режиме. Проблема возникает, когда я хочу вызвать свой экземплярный метод «постоянная ссылка» в моем работнике Resque через ассоциацию, например уведомление. Допустим, вот код, выполняющийся в моей задаче Resque:
post = Notification.find(1234).post
do_something_with_string(post.permalink)
Проблема в том, что ссылка на post.permalink barfs:
NoMethodError: undefined method `permalink' for "#<Post:0xblahblahblah>":Post
at blahblahblah/activerecord-3.0.7/lib/active_record/associations/association_proxy.rb:216:in `method_missing'
Я понял, что здесь происходит какое-то волшебство ActiveRecord, и что я получаю, когда говорю Notification.find (1234) .post - это объект прокси (AssociationProxy). Но я пробовал несколько вещей, чтобы заставить это работать, и я не могу. Я, вероятно, упускаю что-то очевидное, но пока что ActiveRecord делает довольно глупую вещь с моей моделью. Есть ли какая-то волшебная вещь, которую мне нужно сделать с моими моделями, чтобы базовые вещи, такие как методы экземпляров Ruby, работали на них должным образом?
Единственное, что я могу попробовать попробовать, - это заполнить переменные экземпляра в модели after_initialize, а затем добавить attr_reader в модель, чтобы прокси-сервер ассоциации понял, что происходит. Но это похоже на кучу препятствий.