设置许多键/值对

时间:2010-05-28 06:55:26

标签: ruby-on-rails ruby activerecord

我正在处理一个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

3 个答案:

答案 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_protectedattr_accessible告知您自己,因为它们保护属性免受“批量处理”分配“

答案 2 :(得分:0)

您可以使用write_attribute

parsed.each do |key, value|
  updatePerson.write_attribute(key, value)
end
updatePerson.save