Rails 3 «неопределенный метод» в ассоциативном прокси

#ruby-on-rails #ruby-on-rails-3 #activerecord

#ruby-on-rails #ruby-on-rails-3 #activerecord

Вопрос:

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

 class Post < ActiveRecord::Base
    ...

    def permalink
      "http://some_url.com/p/#{id}"
    end
end

class Notification < ActiveRecord::Base
    belongs_to :post
    ...
 end
  

Кроме того, у меня есть очередь запросов, которую я использую для обработки заданий в автономном режиме. Проблема возникает, когда я хочу вызвать свой метод экземпляра «постоянной ссылки» в моем Resque worker через ассоциацию, например, уведомление. Допустим, вот код, выполняемый в моей задаче Resque:

 post = Notification.find(1234).post
do_something_with_string(post.permalink)
  

Проблема в том, что ссылка на post.permalink приводит к разрывам:

 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. постоянная ссылка не private метод?

2. На самом деле это так странно, поэтому я думаю, что вы не показали нам что-то важное.

3. Это не очень полезно. Возможно, если бы вы могли включить некоторые предложения о «чем-то важном», которые вы хотели бы, чтобы я включил. Я могу заверить вас, что ошибка возникает с таким простым кодом.

4. Здесь не так много, чтобы продолжать, но либо попробуйте вызвать Post.notification.find(1234), либо измените методы постоянной ссылки на метод класса self.permalink . Дайте нам знать. Всего наилучшего

5. Итак, предложение состоит в том, чтобы использовать метод класса и передать экземпляр моего класса для ссылки на его переменные экземпляра? Разве не в этом весь смысл метода экземпляра?

Ответ №1:

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

Комментарии:

1. Я думаю, я должен был упомянуть в вопросе, что я знаю об этом ограничении, и ошибка сохраняется при перезапуске рабочих. Однако я ценю ваш ответ.