Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails与Redis的验证_Ruby On Rails_Ruby On Rails 3_Activerecord_Redis - Fatal编程技术网

Ruby on rails Rails与Redis的验证

Ruby on rails Rails与Redis的验证,ruby-on-rails,ruby-on-rails-3,activerecord,redis,Ruby On Rails,Ruby On Rails 3,Activerecord,Redis,我有一堆像这样的Redis能手和二传手 def share_points= p $redis.set("store:#{self.id}:points:share", p) if valid? end 问题是,ActiveRecord的验证并没有阻止将值插入redis。如何在每个setter上添加(如果有效?),而不添加有效?每次调用时都会计算验证。如果您正在编辑的模型是从active\u记录派生的,那么您可能希望对redis进行特定的包装调用,以便为您执行验证。e、 g class Fo

我有一堆像这样的Redis能手和二传手

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

问题是,ActiveRecord的验证并没有阻止将值插入redis。如何在每个setter上添加
(如果有效?
),而不添加
<代码>有效?
每次调用时都会计算验证。

如果您正在编辑的模型是从active\u记录派生的,那么您可能希望对redis进行特定的包装调用,以便为您执行验证。e、 g

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
class Foo
你也可以把它放在一个模块中并包含进去


如果您不是从AR:Base派生的,那么您可能希望使用ActiveModel生成一个更像AR::Base的结构,如下所述:

在保存后切换到
回调方法怎么样?在该方法中,您存储所有已更改的字段,并将它们一次性保存到redis

比如:

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
class Foo

我认为即使是这样,也可以进行重构和清理,但你明白了。

哦,我想你可以做的另一件事是在$redis.set上修补一些别名,但这会影响对$redis.set的所有调用,所以我在同一个模型上使用MongoDB(mongoid)和redis。使用valid的问题是什么?它每次调用时都会运行所有的模型验证(源代码:)。如果我更新4个redis属性,它将运行5次验证。如果验证的计算成本不高,这有关系吗?IIRC,mongoid有after_save回调,因此您可以使用mset(redis.io/commands/mset)而不是在其中一个中进行设置。您需要在redis v的某个地方有一个参数列表。基于mongo。这里有一个要点(假设mset需要一个散列…):我不确定这是一个好主意,因为它涉及覆盖update_属性,但我认为它可以完成这项工作。谢谢。这就是我今天提出的解决方案,只是做了一些小改动。“多”比“一个接一个”快吗?您仍在一个接一个地执行,但“多”
可以使客户端通过管道处理请求,并将其作为事务的一部分执行。