我将在 2.2.2 上运行的 Rails 站点迁移到 Rails 3.1。
我现在注意到,在 Rails 3 上,过去在 2.2.2 中工作的 save() 调用 (INSERTS) 在 3.1 中没有
数据库中的 id 字段是主键,因此它具有以下属性:
非空
自增
现在,当 save() 方法在这些表上运行时,我得到:
ActiveRecord::StatementInvalid (PG::Error: ERROR: null value in column "id" violates not-null constraint
嗯,所以我查看了 save() 创建的生成 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