2008-10-22 8 views
8

वस्तुओं वर्तमान में, अगर मैं ActiveRecord वस्तुओं का एक समूह के लिए एक विधि लागू करना चाहते हैं, मैं इतना की तरह कॉल की संरचना करने के लिए है:आप कैसे एक विधि ActiveRecord का संग्रह करने के लिए लागू कर सकता हूँ

messages = Message.find(:all) 
csv = Message.to_csv(messages) 

कैसे कर सकते हैं मैं विधि को परिभाषित करता हूं ताकि यह इस प्रकार संरचित हो?

messages = Message.find(:all) 
csv = messages.to_csv 

यह वर्तमान मॉडल कोड है:

require 'fastercsv' 
class Message < ActiveRecord::Base 
    def Message.to_csv(messages) 
    FasterCSV.generate do |csv| 
     csv << ["from","to", "received"] 
     for m in messages 
     csv << [m.from,m.to,m.created_at] 
     end 
    end 
    end 
end 

उत्तर

0

आप अपने संदेश वर्ग पर एक विधि की तर्ज पर कुछ करने के लिए बना सकते हैं ...

अपने नियंत्रक में ... ।

@csv_file = Message.send_all_to_csv 

अपने मॉडल में ...

require 'fastercsv' 
class Message < ActiveRecord::Base 
    def send_all_to_csv 
    @messages = Find.all 
    FasterCSV.generate do |csv| 
     csv << ["from","to", "received"] 
     for message in @messages 
     csv << [message.from,message.to,message.created_at] 
     end 
    end 
    # do something with your csv object (return it to the controller 
    # or pass it on to another class method 
    end 
end 
0

आप messages वस्तु पर ही सीधे विधि निर्धारित कर सकते हैं, लेकिन अगर आप ऐसा करते हैं, विधि केवल कि विशिष्ट उदाहरण के लिए उपलब्ध होगा:

def messages.to_csv() 

    FasterCSV.generate do |csv| 
    csv << ["from", "to", "received"] 
    self.each { |m| csv << [m.from, m.to, m.created_at] } 
    end 

end 

तो फिर तुम यह इतना की तरह कह सकते हैं:

messages.to_csv 

मैं एक रूबी नौसिखिया हूँ, इसलिए मुझे यकीन है कि अगर यह मुहावरेदार रूबी या नहीं है नहीं कर रहा हूँ: कैसे आम कि है, मुझे यकीन है कि नहीं कर रहा हूँ या उसे सीधे वस्तु उदाहरणों पर नए तरीकों को परिभाषित करने के लिए है स्वीकार किए जाते हैं, मुझे केवल यह पता है कि यह संभव है ;-)

2

FasterCSV ऐरे क्लास को पैच करता है और पहले से ही 'to_csv' विधि जोड़ता है, लेकिन यह वही नहीं करता जो आप चाहते हैं। तुम खुद के ऊपर लिख सकता है की तरह कुछ कर रही द्वारा:

class Array 
    def to_csv(options = Hash.new) 
    collect { |item| item.to_csv }.join "\n" 
    end 
end 

या कुछ उन पंक्तियों के साथ है, लेकिन उस तरह का भद्दा है।

ईमानदारी से, यह आपके मॉडल पर क्लास विधि के रूप में इसे करने के तरीके के बारे में अधिक समझ में आता है।

6

निम्नलिखित संदेश सरणी में शामिल सभी उदाहरणों पर to_csv को कॉल करेंगे।

messages = Message.find(:all) 
csv = messages.map { |message| message.to_csv } 

रेल में, रूबी 1.9 में या प्रतीक # अन्य साधनों के माध्यम से उपलब्ध to_proc साथ, आप भी यह छोटा कर सकते हैं करने के लिए: जब आप एक अधिक जटिल बनाना चाहते

csv = messages.map(&:to_csv) 

अब प्रपत्र उपयोगी है आपरेशन: lib/ में एक फ़ाइल में

csv = messages.map { |message| 
    if message.length < 1000 
    message.to_csv 
    else 
    "Too long" 
    end 
} 
+0

प्रतीक # to_proc को प्राप्त करने का एक और तरीका नई रेल में मौजूद नहीं है भी माणिक 1.8.7 – artemave

3

रखें इस। मैं इसे पसंद base_ext.rb

require 'fastercsv' 
class ActiveRecord::Base 
    def self.to_csv(objects, skip_attributes=[]) 
    FasterCSV.generate do |csv| 
     csv << attribute_names - skip_attributes 
     objects.each do |object| 
     csv << (attribute_names - skip_attributes).map { |a| "'#{object.attributes[a]}'" }.join(", ") 
     end 
    end 
    end 
end 

उसके बाद कुछ बुला की सिफारिश करेंगे, config/environment.rb के पास जाकर फ़ाइल के तल पर require 'base_ext' डाल नया विस्तार शामिल करने के लिए।अपने सर्वर को पुनरारंभ करने पर आपको सभी मॉडल वर्गों पर to_csv विधि तक पहुंच प्राप्त करनी चाहिए और जब आप इसे पास करते हैं तो ऑब्जेक्ट्स की एक सरणी आपके लिए एक अच्छा सीएसवी प्रारूप उत्पन्न करनी चाहिए।

+0

config/environment.rb में उपलब्ध है, यह करता है? इसके अलावा फ़ाइल नाम _base_ext.rb_ या base_ext.rb होना चाहिए? –

+0

हां यह अस्तित्व में है। मैंने अभी फ़ाइल नाम तय कर दिया है। –

0

यह एक ए.आर. मॉडल के लिए अलग है अगर मैं एक to_custom_csv_array उदाहरण विधि

def to_custom_csv_array 
    [self.from,self.to,self.created_at] 
end 
जोड़ना होगा

तो वर्ग

def self.find(*args) 
    collection = super 
    collection.extend(CustomToCSV) if collection.is_a?(Array) 
end 

और CustomToCSV में पर मिल ओवरराइड सीएसवी उत्पन्न करने के लिए to_custom_csv परिभाषित

module CustomToCSV 
    def to_custom_csv 
    FasterCSV.generate do |csv| 
     csv << ["from","to", "received"] 
     csv << self.map {|obj| obj.to_custom_csv_array} 
    end 
    end 
end 

यह स्मृति से है लेकिन काम करना चाहिए।

0

मुझे पता है कि यह एक बहुत पुराना सवाल है, लेकिन अभी भी एक प्रतिक्रिया प्रदान करने का विचार किया गया है। जांच ब्लॉग http://blog.zahiduzzaman.com/2013/07/adding-tocsv-method-to-active-record.html सिर्फ इस

+0

आपके द्वारा प्रदान किया गया लिंक 2015 में टूट गया है। – Chris

+0

इसे देखने के लिए खेद है, लेकिन मैं अभी भी लिंक तक पहुंचने में सक्षम हूं। क्या आप बता सकते हैं कि आप – Zahiduzzaman

+0

लिंक देख सकते हैं, अब मैं इसे देख सकता हूं! ... लेकिन मुझे आश्चर्य है कि यही कारण है कि वास्तव में यहां जवाब इनलाइन होना अच्छा होगा? – Chris

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

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