2010-02-08 15 views
6

मेरे पास एक MySQL तालिका में BINARY (16) फ़ील्ड में संग्रहीत यूयूआईडी के साथ एक मॉडल है। जब मैं गेटटर विधि का उपयोग करता हूं तो मैं सेटर विधि के लिए पारदर्शी रूप से हेक्साडेसिमल यूयूआईडी को बाइनरी में परिवर्तित करने में सक्षम होना चाहता हूं।मैं मॉडल में ActiveRecord विधि को पारदर्शी रूप से संशोधित कैसे कर सकता हूं?

आगे बढ़ने का 'सही' तरीका क्या है?

+0

क्या नीचे दिए गए उत्तर और टिप्पणियां मदद मिलीं? क्या आपको कुछ ऐसा मिला जो आपके लिए काम करता था? –

उत्तर

7

आप सेटर और गेटर ओवरराइड। इस तरह का माइग्रेशन:

class AddUuidToUsers 
    def self.up 
    execute "ALTER TABLE users ADD uuid BINARY(16)" 
    end 
end 
+0

प्रति मॉडल या प्रति-क्षेत्र आधार पर गेटर और सेटर को ओवरराइड करना सामान्य रूप से BINARY (16) को संभालने के तरीके को सक्रिय करने के रूप में सुरुचिपूर्ण नहीं है। –

+2

add_column का उपयोग करके: बाइनरी एक बिनरी प्रकार नहीं देता है। यह एक बीएलओबी प्रकार देगा। –

+0

मैंने उपरोक्त कोड उदाहरणों को भी आजमाया और कुछ समस्याओं में भाग लिया। सबसे पहले, मुझे लगता है कि आप पैक (सी *) के बजाय पैक ("सी *") मतलब था। लेकिन अधिक आम तौर पर, यदि संभव हो, तो मैं रूबी में ऐसा करने के बजाय MySQL को BINARY (16) प्रकार से रूपांतरण को संभालने देता हूं। Http://code.openark.org/blog/mysql/common-data-types-errors-compilation पर हारून स्क्रग्स की टिप्पणी (# 11) के मुताबिक, "हेक्स() और यूएनएचएक्स() फ़ंक्शन आपको बीच में कनवर्ट करने की अनुमति देते हैं बाइनरी डेटा और एप्लिकेशन के अनुकूल हेक्साडेसिमल स्ट्रिंग। " –

1

मैंने ActiveRecord 2.3.5 (mysql_adapter.rb) के स्रोत स्रोत को देखा।

NATIVE_DATABASE_TYPES = { 
    :primary_key => "int(11) DEFAULT NULL auto_increment PRIMARY KEY".freeze, 
    :string  => { :name => "varchar", :limit => 255 }, 
    :text  => { :name => "text" }, 
    :integer  => { :name => "int", :limit => 4 }, 
    :float  => { :name => "float" }, 
    :decimal  => { :name => "decimal" }, 
    :datetime => { :name => "datetime" }, 
    :timestamp => { :name => "datetime" }, 
    :time  => { :name => "time" }, 
    :date  => { :name => "date" }, 
    :binary  => { :name => "blob" }, 
    :boolean  => { :name => "tinyint", :limit => 1 } 
} 

भी ध्यान रखें कि: द्विआधारी नहीं है तुम क्या चाहते, क्योंकि वह एक ब्लॉब स्तंभ बनाता NATIVE_DATABASE_TYPES हैश को देखते हुए यह स्पष्ट है कि यह द्विआधारी (16) डेटा प्रकार का समर्थन नहीं करता बनाता है।

यदि आपके पास झुकाव है, तो मैं BINARY (16) प्रकार का समर्थन करने के लिए ActiveRecord को विस्तारित करने की अनुशंसा करता हूं।

अद्यतन: मैथ्यू हिगिन्स द्वारा निम्नलिखित ब्लॉग पोस्ट को खोजने के बाद कुछ आशाजनक प्रतीत होता है ("मनमाने ढंग से एसक्यूएल स्टेटमेंट माइग्रेशन में निष्पादित किया जा सकता है, लेकिन विकल्प वैकल्पिक प्रकार के कॉलम का समर्थन करने के लिए MySQL एडाप्टर को विस्तारित करना है।"): http://www.strictlyuntyped.com/2008/07/mysql-lovin-part-2-adding-new-column.html

यदि आपको यह काम करने के लिए मिलता है, तो मैं आशा करता हूं कि आप जो साझा करते हैं उसे साझा करें। मैथ्यू की तरह, मैं देखना चाहता हूं कि ActiveRecord में कॉलम प्रकार जोड़ने के लिए क्लीनर एपीआई है। क्योंकि आप डीबी के लिए कच्चे बाइट्स भेज रहे हैं,

class User < ActiveRecord::Base 
    def uuid=(value) 
    @uuid = write_attribute(:uuid, value.scan(/../).map {|n| n.to_i(16)}.pack("C*")) 
    end 

    def uuid 
    @uuid ||= read_attribute(:uuid).unpack("C*").map {|n| sprintf("%02x", n)}.join 
    end 
end 

बेशक, आप किसी बायनरी स्तंभ चाहते हैं:

संबंधित मुद्दे

 संबंधित मुद्दे