मेरे पास रेडिस गेटर्स का एक समूह है और जैसे बसता है
def share_points= p
$redis.set("store:#{self.id}:points:share", p) if valid?
end
बात यह है, ActiveRecord का सत्यापन मान्य नहीं है, मानों को रेडिस में डालने से रोकता है। मैं इसे बिना जोड़े कैसे कर सकता हूं if valid?
हर सेटर पर? valid?
हर बार मान्यता की गणना की जाती है।
उत्तर:
उत्तर № 1 के लिए 1में स्विच करने के बारे में क्या 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
मुझे लगता है कि यहां तक कि इसे फिर से बनाया जा सकता है और साफ किया जा सकता है लेकिन आपको इसका विचार है।
उत्तर № 2 के लिए 1
यदि आप जिस मॉडल का संपादन कर रहे हैं वह सक्रिय_कार्ड से लिया गया है, तो आप संभवतः रेडिस को एक विशिष्ट, लिपटा कॉल करना चाहते हैं जो आपके लिए सत्यापन करता है। उदा।
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: बेस से व्युत्पन्न नहीं हो रहे हैं, तो आप अधिक AR के साथ आना चाह सकते हैं :: ActiveModel का उपयोग करते हुए बेस जैसी संरचना यहां बताई गई है: http://purevirtual.de/2010/04/url-shortener-with-redis-and-rails3/