0

私のユースケースは次のとおりです。

私は csv ファイルを読んでいて、そこにある列ヘッダーをハッシュとして取得したいと考えています。次に、これらの列名の行値をデータベースに保存します。

私がやりたいことは次のとおりです。

  • 着信 CSV ファイルのハッシュキー =[Col1, Col2, Col3]
  • これらの値を次のデータベース列にマップしたい:[colA, colB, colC]
  • データベースの列に名前を付けたくありませんが、Col1, Col2, Col3これらをモデル属性として使用したいと考えています。

一部の属性がデータベース列ではないモデルを作成するにはどうすればよいですか?

ありがとう

4

2 に答える 2

0

各列名で行うことは次のとおりです。

col = 'Col20'

必要な小文字 + 文字の形式に変換するには、まず数値を取得します。

number = col.match(/(\d+)/).try(:[],1).to_i
=> "20"

上記は番号を見つけようとし、一致する場合はその番号を取得しようとします。

次に変換します (1=A、20=T、...):

new_col = col.downcase.sub( /\d+/, (number+64).chr )
=> "colT"

次に、次のように、必要なオブジェクトにそのようなプロパティを定義します。

my_object.class_eval { attr_accessor new_col }

そして、次のように値を割り当てます。

my_object.colT = "New Value"

または動的に:

my_object.send "#{new_col}=", "New Value"

そして、名前で呼び出して既存の値を取得します。

my_object.colT
=> "New Value"

または動的に:

my_object.send new_col
=> "New Value"
于 2013-11-01T21:04:00.623 に答える
0

データベース テーブルを行 ->* フィールド ( row.has_many fields) として記述します。

次に、Rowクラス overridemethod_missingで、その中で不足している名前を介してターゲット フィールドを検索します。したがって、Field.name=='foo'の場合、row.fooこのレコードを取得してその値を返します。row.foo=を呼び出すと、 ;'bar'に渡さ:'foo='れます。method_missingを検出し=て、ターゲット フィールドに値を割り当てることができます。「ActiveRecord method_missing has_many」をグーグル検索すると、すでにこれを行っているコードにヒットする可能性があります。

于 2013-11-01T17:15:47.533 に答える