0

私はExcelファイルのインポーターを持っています。属性名を持つ列名を持つ Excel シートからレコードをインポートしたいと考えています。

class DDImporter
  def initialize(path)
    @path = path 
  end

  def extract sheet_name
    file = Roo::Excelx.new(@path)
    file.default_sheet = sheet_name

    header = file.row 1
    2.upto(file.last_row) do |i|
      row = Hash[[header, file.row(i)].transpose]
      row.delete "id"
      # row => ['name', 'price', 'product_id']
      sheet_name.classify.constantize.where(name: row['name']).first_or_create # I need to put attributes hash here
    end
  end
end
4

1 に答える 1

0

あなたの質問を正しく理解できれば、Structあなたが探しているものを達成するために a を使用できると思います。

self.class.const_set(sheet_name.classify, Struct.new(*header.map(&:to_sym)))

sheet_nameすべてのヘッダー値に対して定義されたアクセサを持つという名前のクラスを作成します。したがって、 を仮定するsheet_namefoo、次のことができます。

Foo.new(*row)

だから一緒に:

header =  ['name', 'price', 'product_id']
row = ['blah', 123, 234]
sheet_name = 'foo'
Object.const_set(sheet_name.classify, Struct.new(*header.map(&:to_sym))) #=> Foo
Foo.new(*row) #=> #<struct Foo name="blah", price=123, product_id=234>

上記で b/cself.classが使用されていることに注意してください。このオブジェクトは、その親の下で名前空間が設定されます。Objectそれがあなたが望むものでない場合は、いつでもそれを呼び出すことができます

于 2013-10-25T23:19:54.813 に答える