Проверка Rails с помощью Redis - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть несколько методов получения и установки Redis, таких как

def share_points= p
  $redis.set("store:#{self.id}:points:share", p) if valid?
end

Дело в том, что проверка ActiveRecord не останавливает вставку значений в Redis.Как мне сделать это без добавления if valid? на каждый сеттер?valid? вычисляет проверку каждый раз, когда она вызывается.

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

Как насчет перехода на after_save метод обратного вызова, где вы сохраняете все поля, которые были изменены, и просто сохраняете их все сразу, чтобы повторить.

Что-то вроде:

class Foo < ActiveRecord::Base

  after_save :persist_to_redis
  attr_accessor :redis_attributes

  def share_points=(p)
    @redis_attributes ||= {}
    @redis_attributes[:share_points] = p
  end

  def something_else=(p)
    @redis_attributes ||= {}
    @redis_attributes[:something_else] = p
  end

  private

  def redis_store_share_points(value)
    $redis.set("store:#{self.id}:key", value)
  end


  def redis_store_something_else(value)
    $redis.set("something_else:#{self.id}", value)
  end

  def persist_to_redis
    $redis.multi do
      @redis_attributes.each_pair do |key, value|
        send("redis_store_#{key}".to_sym, value)
      end
    end
  end

end

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

1 голос
/ 20 декабря 2011

Если модель, которую вы редактируете, получена из active_record, то вы, вероятно, захотите сделать специальный, завернутый вызов redis, который сделает проверку за вас. например,

class Foo < ActiveRecord::Base
  def rset(key,value)
    $redis.set("store:#{self.id}:key", value) if valid?
  end
  def share_points=(p)
     rset("points:share", p)
  end
end

Вы также можете поместить это в модуль и включить его.

Если вы не производите от AR: Base, вы можете придумать более AR-Base-подобную структуру, используя ActiveModel, как описано здесь: http://purevirtual.de/2010/04/url-shortener-with-redis-and-rails3/

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