2016-11-10 50 views
0

我的應用程序的幾個對象需要導出爲CSV。 基於#362 Exporting CSV and Excel我增加了以下功能的模型:如何在Ruby on Rails模型中保持DRY?

### private functions definitions 
private 

def self.to_csv 
    CSV.generate(:col_sep => ";") do |csv| #Could accept a separator option 
    csv << column_names 
    all.each do |column| 
     csv << column.attributes.values_at(*column_names) 
    end 
    end 
end 

我怎樣才能在模型層,再利用這個功能在其他型號的?

感謝。

回答

2

您可以定義模塊,常用的方法:

module CsvHelper 
    def to_csv 
    CSV.generate(:col_sep => ";") do |csv| #Could accept a separator option 
     csv << column_names 
     all.each do |column| 
     csv << column.attributes.values_at(*column_names) 
     end 
    end 
    end 
end 

現在在課堂上使用:

extend CsvHelper 

附:類的方法'範圍不會在類的範圍內變化private

如果你真的想擁有一個私人的單身方法,你會做到以下幾點:

class Foo 
    class << self 
    private 

    def bar 
    end 
    end 
end 

現在bar方法是私有的。

1

如果這個應用程序是不是一個玩具項目更多,我建議使用逗號類似寶石的東西https://github.com/comma-csv/comma

如果你eager-這將很好地工作了幾齣口,應爲一對夫婦是確定1000行加載所有關聯,並且沒有任何相關查詢。

如果您需要擔心生成包含數十萬或數百萬行的文件,您應該考慮在後臺作業中運行這些文件,或者如果您使用的數據庫類似於postgres,則可以利用postgres的內置CSV這一代非常快。有一個很好的寶石,使這個過程非常無痛:https://github.com/diogob/postgres-copy