2013-04-25 71 views
0

我将在2.2.2上运行的Rails站点迁移到Rails 3.1。Rails 3 ActiveRecord save()方法和自动增量主键字段

我现在注意到,on Rails的3保存()调用,用于2.2.2工作(插入)不要在3.1

在数据库中的id字段是一个主键,因此它具有以下属性:

不为空
自动递增

enter image description here

现在,当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 
+0

能你发布你的模型的代码? – 2013-04-25 15:02:58

+0

ActiveRecord不应在insert语句中包含id列。通常它不会那样做。我们需要更多的代码来发现问题。 – tessi 2013-04-25 15:04:30

+0

它看起来像你的id没有被指定为主键。推广你的索引id到一个实际的主键,http://dba.stackexchange.com/a/9219 – 2013-04-25 15:06:56

回答

0

添加set_primary_key "id"的机型修复了这个问题,但似乎真的混乱和不必要的给我