0

我正在将 .csv 文件导入到 Ruby on Rails 应用程序中。导入器将从文件的每一行创建一个新的数据库记录。

class Invoice < ApplicationRecord

  def self.import(file)
    output_log = []
    CSV.foreach(file.path) do |row|
      output_log << some_method_name(row)
    end
    return output_log
  end

end

我希望将数据验证、记录创建和错误报告的所有复杂性隐藏在另一种方法中,而不是让我的import方法变得混乱。我以打电话some_method_name为例。我真的应该打电话给什么?

我想到了两种可能。实例方法:

output_log << Invoice.new.populate_from_row(row)

或者,一个类方法:

output_log << Invoice.create_from_row(row)

(要么会返回一个记录成功或失败的字符串。)

两者都可以,但哪个更有意义?是否有一些设计原则或模式可以告诉我如何选择?

4

1 回答 1

0

我建议您在方法中使用最合适的方法名称,import并将所有逻辑封装在私有方法(或服务对象)中。在我的应用程序中,我通常会执行以下操作:

class Invoice < ApplicationRecord

  def self.import(file)
    output_log = []
    CSV.foreach(file.path) do |row|
      output_log << create_invoice_from_csv_row(row)
    end
    return output_log
  end

  private

  def create_invoice_from_csv_row(row)
    Invoice.find_or_create_by(
      order_number: row["Order Number"],
      customer_name: row["Customer Name"],
      # ...
    )
    return ""
  rescue => e
    return e.message
  end
end
于 2018-08-21T20:27:16.203 回答