Rails 3 "неопределенный метод" в прокси ассоциации - PullRequest
0 голосов
/ 23 мая 2011

У меня есть модель, к которой я добавил пару вспомогательных методов. Очень надуманный пример:

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 в модель, чтобы прокси-сервер ассоциации понял, что происходит. Но это похоже на кучу препятствий.

1 Ответ

0 голосов
/ 23 мая 2011

Вы упомянули, что этот код работает в Resque. После того, как вы добавили метод permalink, вам необходимо убедиться и перезапустить ваших сотрудников Resque. Перезапуск сервера rails не делает это за вас - вам нужно вручную убить / перезапустить процессы Resque.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...