我正在处理一个rake任务,该任务从JSON提要导入名为Person的ActiveRecord。
Person有很多属性,而不是编写代码行来设置我尝试不同方法的每个属性。
我得到的最接近的如下所示。这对于输出到屏幕很有效,但是当我检查实际上已经在ActiveRecord上设置了值时,它总是为零。 所以看起来我不能用.to_sym来解决我的问题?
有什么建议吗?
我还应该提一下,我刚开始使用Ruby,已经做了很多Objective-c,现在需要接受Interwebs:)
http = Net::HTTP.new(url.host, url.port)
http.read_timeout = 30
json = http.get(url.to_s).body
parsed = JSON.parse(json)
if parsed.has_key? 'code'
updatePerson = Person.find_or_initialize_by_code(parsed['code'])
puts updatePerson.code
parsed.each do |key, value|
puts "#{key} is #{value}"
symkey = key.to_sym
updatePerson[:symkey] = value.to_s
updatePerson.save
puts "#{key}....." # shows the current key
puts updatePerson[:symkey] # shows the correct value
puts updatePerson.first_name # a sample key, it's returning nil
end
答案 0 :(得分:1)
您可能正在寻找update_attributes()
:
if parsed.has_key?('code')
code = parsed.delete('code')
person = Person.find_or_initialize_by_code(code)
if person.update_attributes(parsed)
puts "#{person.first_name} successfully saved"
else
puts "Failed to save #{person.first_name}"
end
end
答案 1 :(得分:1)
您的代码无法分配任何属性,因为您始终指定名为“symkey”的单个属性:
symkey = key.to_sym
updatePerson[:symkey] = value.to_s # assigns to attribute "symkey", not to the attribute with the name stored in variable symkey
如果您想将密钥变为符号(可能甚至不需要),然后将其用作索引来访问updatePerson中的属性,您可以写:
updatePerson[key.to_sym] = value.to_s
updatePerson.save
但是 - 或多或少 - 与
相同updatePerson.updateAttribute(key.to_sym, value.to_s) # update and save
除了没有触发验证,因此请小心使用。
在表现方面,在每次作业后保存此人可能不是一个好主意,所以也许你想要在分配所有属性之前推迟.save()
通话。
尽管如此,updateAttributes(...)
是您可能想要查看的内容 - 如果您这样做,请不要忘记通过attr_protected
或attr_accessible
告知您自己,因为它们保护属性免受“批量处理”分配“
答案 2 :(得分:0)
您可以使用write_attribute:
parsed.each do |key, value|
updatePerson.write_attribute(key, value)
end
updatePerson.save