0

我将在 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
4

1 回答 1

0

添加set_primary_key "id"到模型中解决了这个问题,但对我来说似乎真的很乱而且没必要

于 2013-04-26T14:07:29.130 回答