2017-08-07 124 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