2012-10-28 37 views
0

我對這一切都很陌生,所以請假設我的知識最糟糕。關於在update_attribute中使用變量而不是符號

record = tablename.new 
result["top"].each do |r| #result is the answer from a variable length JSON 
    if ActiveRecord::Base.connection.column_exists?(:tablename, r["aaa"]["bbb"]) 
    record.update_attribute(r["aaa"]["bbb"] , r["ccc"]) 
    else 
    ActiveRecord::Base.connection.add_column(:tablename, r["aaa"]["bbb"] , :integer) 
    #record.update_attribute(r["aaa"]["bbb"] , r["ccc"]) 
    end 
record.save 

我得到這個錯誤,因爲我在update_attribute使用變量,而不是一個符號:

undefined method `stringify_keys' for "contents of r["aaa"]["bbb"]":String (NoMethodError) 

我不能,雖然使用符號,因爲我真的不知道列的名稱 - 這一切都動態生成的,因爲你可以從這個線看:

ActiveRecord::Base.connection.add_column(:tablename, r["aaa"]["bbb"] , :integer) 

總之,我怎麼能適應具有update_attribute可變列名?

+0

String上沒有'stringify_keys'方法。對於這個問題,也不是符號。 –

+0

什麼是完整的堆棧跟蹤? –

+0

嗯,我不知道堆棧跟蹤是什麼,但完整的錯誤是:/home/ubuntu/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.3/lib/active_record/ 「[assign_attributes]:未定義的方法'stringify_keys'爲r [」aaa「] [」bbb「]」的內容:String(NoMethodError) – DharmaTurtle

回答

0

你可以使用String#to_sym

record.update_attribute(r["aaa"]["bbb"].to_sym , r["ccc"]) 
+0

好的建議,但是這讓我這個錯誤,時間戳是DB中的一個以前建立的列:active_model/attribute_methods.rb:407:in method_missing':undefined method'r [「aaa」] [「bbb」]的內容,然後由於某種原因等號='for #tablename id:nil,timestamp:「2012-10-28 13:01:47」>(NoMethodError) – DharmaTurtle

+0

'record.update_attribute(:foo,「something」)''有效地做'record.foo =「something」; record.save',所以你需要在你的數據庫中有一個'foo'列來保存它。你有沒有在列表中列出任何'r [「aaa」] [「bbb」]'返回的列? – edouardbriere

+0

是的,add_column插入列名稱r [「aaa」] [「bbb」](如果不存在),如預期的那樣。 – DharmaTurtle

0

很抱歉,但沒有足夠的積分,您的評論字符串轉換爲符號。

edouardbriere回答了你的問題,但你能解釋你的用例嗎?作爲某些數據的結果編輯模式幾乎從不在任何地方靠近正確的方式做某事。

相關問題