रेडिस के साथ वैधताएं रेल

मेरे पास रेडिस गेटर्स का एक समूह है और जैसे बसता है

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/