Rails 3: Обратный вызов, когда определенный объект извлекается из базы данных (Mongo Mapper) - PullRequest
1 голос
/ 23 января 2012

Мне нужно что-то, что может вызвать метод, когда объект извлекается из базы данных и вызывается.Так, например, допустим, у меня есть класс Apple.Я выполняю запрос:

Apple.where(:name => "Delicious").first

, который возвращает

#<Apple id: 2, blah, blah, blah>

Мне нужен способ (обратный вызов или другой) для вызова метода, чтобы я мог отслеживать количество разэлемент был извлечен из базы данных.Кто-нибудь может предложить способ сделать это?Я использую MongoDB с MongoMapper.

Ответы [ 3 ]

3 голосов
/ 23 января 2012

Существует обратный вызов after_find , который вызывается после загрузки объекта из базы данных.Итак:

after_find :update_found_count

def found_times
  increment!(:found_count)
end
2 голосов
/ 23 января 2012

Предположим, у вашей модели есть атрибут access_count, вы можете переопределить initialize, чтобы сделать что-то вроде этого:

Обновление: Ответ Шадвелла лучше;направьте ваши откровения в ту сторону.Оставим ниже, если это кому-то пригодится.

class Apple < ActiveRecord::Base
  def initialize *args
    super

    incr_access_count
  end

  private
  def incr_access_count
    update_attribute :access_count => access_count + 1 unless new_record?
  end
end

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

1 голос
/ 23 января 2012

Новый способ переопределения фабрики по умолчанию будет правильным способом сделать это.

Пример:

class Apple < ActiveRecord::Base
  # ...
  def self.delicious
    # increase count or other complex operations here
    where(:name => "Delicious").first
  end
  # ...
end

В этом случае where является заводской настройкой по умолчанию.

С этим вы можете просто позвонить Apple.delicious и покончить с.

...