0

我的用例如下:

我正在读取一个 csv 文件,并且我想将列标题作为哈希来获取。然后我将这些列名的行值保存到数据库中。

我想做的是:

  • 传入的 CSV 文件哈希键 =[Col1, Col2, Col3]
  • 我想将这些值映射到以下数据库列:[colA, colB, colC]
  • 我不希望我的数据库列被命名Col1, Col2, Col3,但我希望这些作为模型属性。

如何制作某些属性不是数据库列的模型?

谢谢

4

2 回答 2

0

将数据库表写为 Row ->* Field ( row.has_many fields)。

然后在您的Row类中 override method_missing,并在其中通过缺少的名称查找目标字段。因此,如果Field.name== 'foo'row.foo则将获取此记录并返回其值。当您调用row.foo='bar'时,它将传递:'foo='method_missing; 您可以检测=并为目标字段分配一个值。谷歌搜索“ActiveRecord method_missing has_many”可能会遇到一些已经这样做的代码。

于 2013-11-01T17:15:47.533 回答
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 回答