Существующая модель Rails без извлечения ее из базы данных - PullRequest
1 голос
/ 10 июля 2011

Кто-нибудь знает, возможно ли создать экземпляр модели и применить идентификатор и любые другие атрибуты, не загружая его из базы данных?Я пытался сделать это, но ассоциации не извлекаются из базы данных :( Любые идеи?


РЕДАКТИРОВАТЬ

Что я хочу сделать, это просто:

  1. Извлечение существующей записи из базы данных.
  2. Сохранить как "хешированный" вывод записи в redis или другом хранилище памяти.
  3. В следующий раз, когда эта запись будет извлечена, извлекитесначала кэшированное хранилище, а если оно не найдено, то перейдите к шагу 1.
  4. Если имеется попадание в кэш, загрузите все кэшированные атрибуты в эту модель и заставьте этот экземпляр модели вести себя так, как если бы это была модель, извлеченная избаза данных с конечным набором столбцов.

Вот где я застрял, я занимался созданием объекта Model.new и установкой каждого из параметров вручную. Это работает, ноон обрабатывает экземплярный объект модели как новую запись. В ActiveRecord должна быть промежуточная подпрограмма, которая выполняет настройку атрибута.

Ответы [ 2 ]

1 голос
/ 15 августа 2012

Я решил проблему, выполнив следующее.

  1. Создайте новый класс модели, который расширяет класс модели, который я хочу кэшировать в памяти.

  2. Установите для table_name нового класса тот же, что и у родительского класса.

  3. Создайте новый метод инициализации, вызовите метод super взатем разрешить параметру этого метода разрешить хеш-переменную, содержащую все свойства родительского класса.

  4. Перегрузить метод new_record? и установить для него значение falseтак что ассоциации работают.

Вот мой код:

class Session < User

  self.table_name = 'users'

  METHODS = [:id, :username] # all the columns that you wish to have in the memory hash
  METHODS.each do |method|
    attr_accessor method
  end

  def initialize(data)
    super({})

    if data.is_a?(User)
      user = data
      data = {}
      METHODS.each do |key|
        data[key] = user.send(key)
      end
    else
      data = JSON.parse(data)
    end

    data.each do |key,value|
      key = key.to_s
      self.send(key+'=',value)
    end
  end

  def new_record?
    false
  end

end
0 голосов
/ 10 июля 2011

Драгоценный камень memcached позволит вам засунуть в него произвольные объекты Ruby. Все это должно быть прозрачно обработано для вас, если вы его используете.

В противном случае взгляните на ActiveRecord :: Base # instantiate, чтобы увидеть, как это делается нормально. Вам нужно будет проследить через кучу рельсов, но вы получите именно такую ​​попытку!

...