0
我將在2.2.2上運行的Rails站點遷移到Rails 3.1。Rails 3 ActiveRecord save()方法和自動增量主鍵字段
我現在注意到,on Rails的3保存()調用,用於2.2.2工作(插入)不要在3.1
在數據庫中的id字段是一個主鍵,因此它具有以下屬性:
不爲空
自動遞增
現在,當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
能你發佈你的模型的代碼? – 2013-04-25 15:02:58
ActiveRecord不應在insert語句中包含id列。通常它不會那樣做。我們需要更多的代碼來發現問題。 – tessi 2013-04-25 15:04:30
它看起來像你的id沒有被指定爲主鍵。推廣你的索引id到一個實際的主鍵,http://dba.stackexchange.com/a/9219 – 2013-04-25 15:06:56