Установка множества пар ключ / значение - PullRequest
0 голосов
/ 28 мая 2010

Я работаю над задачей rake, которая импортирует из фида JSON в 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 ]

1 голос
/ 28 мая 2010

Ваш код не может назначить какой-либо атрибут, потому что вы всегда присваиваете один атрибут с именем "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, так как они защищают атрибуты от «массового назначения»

1 голос
/ 28 мая 2010

Вы, вероятно, ищете 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
0 голосов
/ 28 мая 2010

Вы можете использовать write_attribute :

parsed.each do |key, value|
  updatePerson.write_attribute(key, value)
end
updatePerson.save
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...