संपादित करें: वास्तव में आप ऊपर के लिए क्या देख रहे प्राप्त करने के लिए, आप अपने मॉडल फ़ाइल में डिफ़ॉल्ट सेटर ओवरराइड करने के लिए इस का उपयोग करेंगे:
def path=(value)
self[:path] = connection.execute("SELECT text2ltree('#{value}');")[0][0]
end
तो कोड आप ऊपर है काम करता है।
मुझे ActiveRecord के आंतरिक और इसके अभेद्य मेटाप्रोग्रामिंग अंडरपिनिंग के बारे में अधिक जानने में दिलचस्पी है, इसलिए एक अभ्यास के रूप में मैंने नीचे दी गई टिप्पणियों में जो वर्णन किया है उसे पूरा करने का प्रयास किया।
module DatabaseTransformation
extend ActiveSupport::Concern
module ClassMethods
def transformed_by_database(transformed_attributes = {})
transformed_attributes.each do |attr_name, transformation|
define_method("#{attr_name}=") do |argument|
transformed_value = connection.execute("SELECT #{transformation}('#{argument}');")[0][0]
write_attribute(attr_name, transformed_value)
end
end
end
end
end
class Post < ActiveRecord::Base
attr_accessible :name, :path, :version
include DatabaseTransformation
transformed_by_database :name => "length"
end
कंसोल आउटपुट:
1.9.3p194 :001 > p = Post.new(:name => "foo")
(0.3ms) SELECT length('foo');
=> #<Post id: nil, name: 3, path: nil, version: nil, created_at: nil, updated_at: nil>
वास्तविक जीवन मुझे लगता है आप include
ActiveRecord में मॉड्यूल करना चाहते हैं में यहाँ एक उदाहरण है कि मेरे लिए काम किया (यह सब post.rb में है): : आधार, लोड पथ में कहीं पहले एक फ़ाइल में। आपको डेटाबेस फ़ंक्शन में जो तर्क हो रहा है, उसके प्रकार को सही तरीके से संभालना होगा। आखिरकार, मैंने सीखा कि connection.execute
प्रत्येक डेटाबेस एडेप्टर द्वारा कार्यान्वित किया गया है, इसलिए परिणाम का उपयोग करने के तरीके पोस्टग्रेज़ में अलग हो सकते हैं (यह उदाहरण SQLite3 है, जहां परिणाम सेट हैश की सरणी के रूप में वापस किया जाता है और पहले डेटा रिकॉर्ड की कुंजी । 0] है
इस ब्लॉग पोस्ट अविश्वसनीय रूप से मददगार था:
http://www.fakingfantastic.com/2010/09/20/concerning-yourself-with-active-support-concern/
के रूप में था रेल प्लगइन-लेखन के लिए गाइड:
http://guides.rubyonrails.org/plugins.html
इसके अलावा, यह क्या है इसके लिए, मुझे लगता है कि पोस्टग्रेज़ में मैं अभी भी एक प्रश्न पुनर्लेखन नियम बनाने के लिए माइग्रेशन का उपयोग करके ऐसा करूँगा, लेकिन यह एक महान सीखने के अनुभव के लिए बनाया गया है। उम्मीद है कि यह काम करता है और मैं अब यह कैसे करना है इसके बारे में सोचना बंद कर सकता हूं।
आप पोस्टग्रेस फ़ंक्शन (संग्रहीत प्रक्रिया) लिख सकते हैं और फिर बस 'SELECT myfunc (' 1.2.3 ')' कॉल कर सकते हैं। यदि आप उस मार्ग में रूचि रखते हैं तो मैं एक उदाहरण प्रदान कर सकता हूं। –