【问题标题】:Rails 3 ActiveRecord save() Method and Autoincrement Primary Key FieldsRails 3 ActiveRecord save() 方法和自动增量主键字段
【发布时间】:2013-04-25 14:55:21
【问题描述】:

我将在 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" 可以解决这个问题,但对我来说似乎真的很混乱而且不符合 Rails/Ruby

你们都做了什么来解决这个问题?

感谢您的帮助

这是出现错误的模型之一:

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

【问题讨论】:

  • 你能贴出你的模型的代码吗?
  • ActiveRecord 不应在插入语句中包含 id 列。通常它不会那样做。我们需要您的更多代码来找出问题所在。
  • 您的 id 似乎没有被指定为主键。将 id 上的索引提升为实际的主键 dba.stackexchange.com/a/9219
  • 我在上面贴了型号代码
  • 在模型中添加 set_primary_key "id" 解决了这个问题,但对我来说似乎真的很乱而且没必要

标签: postgresql activerecord ruby-on-rails-3.1


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2011-03-14
    • 2011-09-25
    • 2013-04-18
    • 1970-01-01
    • 2020-07-18
    • 2019-02-21
    相关资源
    最近更新 更多