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