我的用例如下:
我正在阅读一个csv文件,我希望将列标题作为哈希值。 然后我将这些列名的行值保存到数据库中。
我想做的是:
[Col1, Col2, Col3]
[colA, colB, colC]
Col1, Col2, Col3
,但我希望这些列为模型属性。 如何创建某些属性不是数据库列的模型?
由于
答案 0 :(得分:0)
将数据库表写为Row - > * Field(row.has_many fields
)。
然后在你的Row
类覆盖method_missing
中,在里面通过缺少的名称查找目标字段。因此,如果Field.name
== 'foo'
,那么row.foo
将获取此记录并返回其值。当您致电row.foo
= 'bar'
时,会将:'foo='
传递给method_missing
;您可以检测=
并为目标字段指定值。谷歌搜索“ActiveRecord method_missing has_many”可能会遇到一些已经执行此操作的代码。
答案 1 :(得分: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"