Ruby on rails Rails与Redis的验证
我有一堆像这样的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
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_属性,但我认为它可以完成这项工作。谢谢。这就是我今天提出的解决方案,只是做了一些小改动。“多”比“一个接一个”快吗?您仍在一个接一个地执行,但“多”
可以使客户端通过管道处理请求,并将其作为事务的一部分执行。