如何使用Ruby on Rails模型保持DRY?

时间:2016-11-10 16:37:38

标签: ruby-on-rails model dry

我的应用程序的几个对象需要导出为CSV。 基于#362 Exporting CSV and Excel,我将以下函数添加到模型中:

### 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 个答案:

答案 0 :(得分: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

P.S。类的范围不会随着类的范围内的private而改变。

如果你真的想拥有私人单身人士方法,你可以做以下事情:

class Foo
  class << self
    private

    def bar
    end
  end
end

现在bar方法是私有的。

答案 1 :(得分:1)

如果此应用程序不仅仅是一个玩具项目,我建议使用类似逗号gem https://github.com/comma-csv/comma

的内容

如果您急切加载所有关联并且没有任何相关查询,那么这对于数百个的导出很有效,对于几千行应该没问题。

如果您需要担心生成包含数十万或数百万行的文件,您应该考虑在后台作业中运行这些文件,或者,如果您使用像postgres这样的数据库,则可以利用postgres的内置CSV生成这非常快。有一个很好的宝石,使这个过程非常轻松:https://github.com/diogob/postgres-copy