2013-04-25 62 views
0

我將在2.2.2上運行的Rails站點遷移到Rails 3.1。Rails 3 ActiveRecord save()方法和自動增量主鍵字段

我現在注意到,on Rails的3保存()調用,用於2.2.2工作(插入)不要在3.1

在數據庫中的id字段是一個主鍵,因此它具有以下屬性:

不爲空
自動遞增

enter image description here

現在,當save()方法對這些表運行,我得到:

ActiveRecord::StatementInvalid (PG::Error: ERROR: null value in column "id" violates not-null constraint 

嗯,所以我看着生成的SQL的保存()創建並確實它包括在列列表中的ID字段和零分配給它:

PG::Error: ERROR: null value in column "id" violates not-null constraint 
: INSERT INTO "server_updates" ("action", "created_at", "field_number", "id", "status", "table_number", "value") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" 

所以,我的問題是怎麼做的當ActiveRecord通過save()調用生成SQL時,它不包含id列?

我當然不想從列中刪除NOT NULL規則,也不想用原始SQL查詢重寫所有這些save()調用。

添加set_primary_key "id"的機型修復了這個問題,但似乎真的混亂和非軌/紅寶石給我

你什麼都做,以解決此問題?

感謝您的幫助

這裏是得到錯誤的車型之一:

class ServerUpdate < ActiveRecord::Base 



    def ServerUpdate.run_code code 
    su = ServerUpdate.new 
    su.action = 3 # run code 
    su.value = code 
    su.status = 1 
    su.save 
    end 

    def ServerUpdate.new_insert_for_table table 
     su = ServerUpdate.new 
     su.action = 1 # Create New Record 
     su.table_number = table.to_i 
     su.save 
     return su 
    end 



    def ServerUpdate.new_update_for_table_where_field_equals_value table, field, value 
     su = ServerUpdate.new 
     su.action = 2 # Update Record 
     su.table_number = table.to_i 
     su.field_number = field.to_i 
     su.value = value.to_s 
     su.status = 1 ## This used to be in process() method below 
     su.save 
     return su 
    end 

    def ServerUpdate.new_delete_for_table_where_field_equals_value table, field, value 
     su = ServerUpdate.new 
     su.action = 999 # Delete Record 
     su.table_number = table.to_i 
     su.field_number = field.to_i 
     su.value = value.to_s 
     su.save 
     return su 
    end 

    def set_value_for_field value, field, behavior=0 
     sui = ServerUpdateItem.new 




     sui.server_update_id = self.id 
     sui.field_number = field.to_i 
     sui.value = value.to_s 

     b = 0 
     b = 1 if behavior == "prepend" or behavior == 1 
     b = 2 if behavior == "append" or behavior == 2 
     sui.behavior = b 


     sui.save 
    end 

    def process 
     We are now setting status=1 in method: 
     ServerUpdate.new_update_for_table_where_field_equals_value table, field, value 
    self.status = 1 
    self.save 
    end 

end 
+0

能你發佈你的模型的代碼? – 2013-04-25 15:02:58

+0

ActiveRecord不應在insert語句中包含id列。通常它不會那樣做。我們需要更多的代碼來發現問題。 – tessi 2013-04-25 15:04:30

+0

它看起來像你的id沒有被指定爲主鍵。推廣你的索引id到一個實際的主鍵,http://dba.stackexchange.com/a/9219 – 2013-04-25 15:06:56

回答

0

添加set_primary_key "id"的機型修復了這個問題,但似乎真的混亂和不必要的給我