2017-08-07 37 views
1

我有這個數組哈希:字符串化錯誤

object = [ 
    {:user_id=>9, :timesheet_project_id=>4, :timesheet_task_id=>87, :date=>"2017-08-23", :time_spent=>2.0, :comment=>"Test 23"}, 
    {:user_id=>9, :timesheet_project_id=>4, :timesheet_task_id=>87, :date=>"2017-08-23", :time_spent=>2.0, :comment=>"Test 23"} 
] 

我試圖創建SheetEntry的一個新對象,並通過做它保存在模型中:

def self.save_entry(object) 
    entry=SheetEntry.new(object) 
    entry.save! 
end 

但要這個錯誤:

NoMethodError (undefined method `stringify_keys' for Array)

+0

'object'是一個數組,'SheetEntry#new'方法需要一個Hash作爲參數。 (通過執行'SheetEntry.new([1,2,3])''來重現此錯誤)。你必須在調用'save_entry'方法或者讓這個方法處理Array類型參數之前遍歷'object'(它是一個哈希數組)。 – MrYoshiji

+0

是否可以將此數組轉換爲散列? – Archie123

+0

我想你想用數組中的每個元素創建一個對象,是否正確? – Gerry

回答

2

您需要遍歷數組,所以你可以創建一個包含每個哈希的對象,例如:

def self.save_entry(object) 
    object.each do |item| 
    SheetEntry.create!(item) 
    end 
end 

注意,使用create!相當於創建一個新對象,然後將其保存(即new,然後save!)。

正如MrYoshiji指出的那樣,最好將方法名稱更改爲save_entries,這表示它將處理多個對象。

+1

請不要使用單一化的方法名稱,當其邏輯是爲了處理幾個對象。要麼調用這個方法'save_entries(objects)'或者執行'save_entry'方法之外的循環。方法名稱應該足以理解其邏輯和用法,必須閱讀要了解的源代碼纔是錯誤命名的標誌。 – MrYoshiji

+0

@MrYoshiji你是對的,謝謝你指出這一點;我會更新答案。 – Gerry

+1

感謝您的幫助! – Archie123