我的用例如下:
我正在读取一个 csv 文件,并且我想将列标题作为哈希来获取。然后我将这些列名的行值保存到数据库中。
我想做的是:
- 传入的 CSV 文件哈希键 =
[Col1, Col2, Col3]
- 我想将这些值映射到以下数据库列:
[colA, colB, colC]
- 我不希望我的数据库列被命名
Col1, Col2, Col3
,但我希望这些作为模型属性。
如何制作某些属性不是数据库列的模型?
谢谢
我的用例如下:
我正在读取一个 csv 文件,并且我想将列标题作为哈希来获取。然后我将这些列名的行值保存到数据库中。
我想做的是:
[Col1, Col2, Col3]
[colA, colB, colC]
Col1, Col2, Col3
,但我希望这些作为模型属性。如何制作某些属性不是数据库列的模型?
谢谢
将数据库表写为 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”可能会遇到一些已经这样做的代码。
这是您对每个列名称所做的操作。
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"