Rails извлекает сериализованную запись модели - PullRequest
1 голос
/ 08 июля 2011

Я настраиваю хранилище redis, где мои значения user_id сеанса хранятся в файле cookie, а остальные данные модели (имя_символа, фамилия, имя пользователя и т. Д.) Хранятся в файле redis. Я очень плохо знаком с Redis и не знаю, как хранить данные модели.

У меня два вопроса:

  1. Как лучше всего хранить его, если я сериализую его в формате XML, JSON или эквивалентном объекту ruby.

  2. Когда сохраненные данные извлекаются, как я могу преобразовать их в объект рабочей модели? Таким образом, когда я делаю user_fetched_from_redis.username, это будет работать как user_fetched_from_db.username. И если есть какие-либо поля, которые не извлекаются из хранилища redis, то я бы хотел, чтобы activerecord сделал оператор SELECT * FROM, чтобы заполнить все атрибуты в объекте. Возможно ли это?

Ответы [ 2 ]

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

Решение этой проблемы можно найти здесь в другом посте.

Существующая модель Rails без извлечения ее из базы данных

1 голос
/ 08 июля 2011

Посмотрите, как resque справляется с этим. По сути, они используют объекты JSON вместо XML или дампированный объект Ruby, и я бы рекомендовал использовать тот же подход, поскольку это означает меньшую нагрузку. Rails предлагает очень простую .to_json функциональность для множества различных объектов, включая экземпляры ActiveRecord.

Если вы используете JSON для сериализации вашего объекта, он расширится до обычного хеша при десериализации. Нетрудно передать это, чтобы создать собственный класс, который мог бы наследовать атрибуты и использовать method_missing, чтобы либо получить атрибут из объекта json, либо загрузить соответствующую запись базы данных. Примерно так должно работать:

class CachedObject
  attr_accessor :attributes

  def initialize(json)
    self.attributes = ActiveSupport::JSON.decode(json)
  end

  def method_missing(method)
    attributes[method.to_s] || Model.find_by_id(attributes['id']).send(method)
  end
end

obj = CachedObject.new('{"id":"123","foo":"some value"}')
p obj.foo # => "some value"
p obj.bar # => Executes `Model.find_by_id(123).bar`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...