2016-11-10 27 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