मेरे पास कुछ विशेषताओं और वर्चुअल विशेषता वाला मॉडल है। इस वर्चुअल विशेषता का निर्माण सृजन फ़ॉर्म में चेकबॉक्स बनाने के लिए किया जाता है।टाइप करें एक ActiveRecord मॉडल आभासी विशेषता
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
end
क्षेत्र के बाद से के रूप में एक चेकबॉक्स, foo
विशेषता मान के रूप '0'
या '1'
प्राप्त होगा। मैं इसे निम्नलिखित कोड की वजह से एक बूलियन होना चाहते हैं:
class Thing < ActiveRecord::Base
attr_accessor :foo
attr_accessible :foo
before_validation :set_default_bar
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
समस्या है कि यहाँ हालत सच हो जाएगा तब भी जब foo
'0'
है। मैं ActiveRecord प्रकार कास्टिंग तंत्र लेकिन केवल मैं इसे पीछा कर रहा है क्या करने के लिए मिल गया उपयोग करना चाहते हैं:
class Thing < ActiveRecord::Base
attr_reader :foo
attr_accessible :foo
before_validation :set_default_bar
def foo=(value)
@foo = ActiveRecord::ConnectionAdapters::Column.value_to_boolean(value)
end
private
def set_default_bar
self.bar = 'Hello' if foo
end
end
लेकिन मैं इसे इस तरह से कर रही है गंदा लग रहा है। क्या रूपांतरण विधि को फिर से लिखने के बिना कोई बेहतर विकल्प है?
धन्यवाद
क्योंकि मानों को 'सत्य' और 'झूठी' में बदल दिया जा सकता है और इसे अभी भी काम करना चाहिए। रेल ठीक है लेकिन गलत जगह आईएमएचओ में। – Happynoff
'foo =' में @bar को सेट करने के बारे में मुझे लगता है कि यह करने की जगह नहीं है, एक जिम्मेदारी सिद्धांत और सब कुछ। और, मेरे वास्तविक उपयोग-मामले में, इसे पहले_विधीकरण में रखने का अर्थ है;) – Happynoff
आप सही हैं। आपके पास यह समाधान है: https://gist.github.com/2000623 लेकिन मुझे नहीं लगता कि यह एक बेहतर समाधान है। यह मूल रूप से रेल की तुलना में एक ही बात है। स्रोत देखें: https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/column.rb – Dougui