我可以在模型中使用某些属性而不将这些属性作为数据库列,而是映射这些属性吗?

时间:2013-11-01 16:55:13

标签: ruby-on-rails database model

我的用例如下:

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

我想做的是:

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

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

由于

2 个答案:

答案 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"