आप इन्फिनिटी को रेल में समय सीमा के हिस्से के रूप में स्टोर नहीं कर सकते हैं। मेरा मानना है कि ऐसा इसलिए है क्योंकि इन्फिनिटी को एक स्ट्रिंग मान के रूप में डाला जा रहा है और मूल पीएसक्यूएल ओआईडी से निकाले जाने पर फ्लोट के रूप में व्याख्या की जाती है। तो, दिनांक -> फ़्लोट से कोई भी दिनांक सीमा व्यवहार्य नहीं होगी। लेकिन आप छद्म (अब से 1 मिलियन वर्ष) तिथियों के साथ अपनी खुद की सीमा बनाने का प्रबंधन कर सकते हैं या आप केवल दो अलग-अलग दिनांक फ़ील्ड का उपयोग कर सकते हैं और मॉडल में उनकी उचित व्याख्या कर सकते हैं। आरंभ तिथि, समाप्ति तिथि।
रेल 4.2+ में, आप अपने डेटाटाइम प्रकार के अंदर एक फ्लोट ::इन्फिनिटी मान स्टोर कर सकते हैं। उदाहरण।
User.first.update(begin_date: DateTime.now, end_date: 'infinity')
User.first.end_date # => Infinity
हालांकि, end_date
वैध तिथि नहीं होगी। आप बस स्ट्रिंग . को स्टोर कर रहे हैं डेटाबेस में और आप एक फ्लोट . निकाल रहे हैं जब आप इसे कॉल करते हैं।
यहां वास्तविक (रेल 4.2) कोड है जो इसे संभालता है:
module ActiveRecord
module ConnectionAdapters
module PostgreSQL
module OID # :nodoc:
class DateTime < Type::DateTime # :nodoc:
include Infinity
def type_cast_for_database(value)
if has_precision? && value.acts_like?(:time) && value.year <= 0
bce_year = format("%04d", -value.year + 1)
super.sub(/^-?\d+/, bce_year) + " BC"
else
super
end
end
def cast_value(value)
if value.is_a?(::String)
case value
when 'infinity' then ::Float::INFINITY
when '-infinity' then -::Float::INFINITY
when / BC$/
astronomical_year = format("%04d", -value[/^\d+/].to_i + 1)
super(value.sub(/ BC$/, "").sub(/^\d+/, astronomical_year))
else
super
end
else
value
end
end
end
end
end
end
end
दोबारा, आप नहीं एक फ्लोट के साथ दिनांक समय तुलना करने में सक्षम हो। लेकिन, इन दो मानों -::Float::INFINITY
के लिए एक विशेष मामला होना शायद काफी आसान है और ::Float::INFINITY