2013-11-01 17 views
0

我的用例如下:我可以在模型中擁有一些屬性,而不必將這些屬性設置爲數據庫列,而是將這些屬性映射到這些屬性中?

我正在閱讀一個csv文件,我希望將列標題作爲一個散列。 然後我將這些列名的行值保存到數據庫中。

我想要做的是:

  • 傳入CSV文件哈希鍵= [Col1, Col2, Col3]
  • 我想這些值映射到以下數據庫列:[colA, colB, colC]
  • 我不希望我的數據庫列被命名爲Col1, Col2, Col3,但我希望這些作爲模型屬性。

如何製作一個模型,其中某些屬性不是數據庫列?

感謝

+1

'attr_accessor'不夠好? – nzifnab

回答

0

寫入數據庫表的行 - > *場(row.has_many fields)。

然後在你的類覆蓋method_missing,並在裏面通過缺少名稱查找目標字段。因此,如果Field.name == 'foo',則row.foo將獲取此記錄並返回其值。當您撥打row.foo = 'bar'時,將通過:'foo='method_missing;您可以檢測到=併爲目標字段分配一個值。搜索'ActiveRecord method_missing has_many'可能會碰到一些已經這樣做的代碼。

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" 

並得到其存在G值由對罵吧:

my_object.colT 
=> "New Value" 

或動態:

my_object.send new_col 
=> "New Value" 
相關問題