Rails-在插入PostgreSql时发生ActiveRecord错误

Rails-在插入PostgreSql时发生ActiveRecord错误,postgresql,ruby-on-rails-3.2,rails-activerecord,Postgresql,Ruby On Rails 3.2,Rails Activerecord,我已经接管了现有的Rails 3.2.9应用程序,并尝试在本地windows 7计算机上进行设置,但在尝试注册用户时出现以下错误: ActiveRecord::语句在中无效 Workers::RegistrationControllerCreate PG::Error:错误:列id中的null值与not null冲突 约束详细信息: 失败行包含null, 8f9f248b33a121ec83a38310,ZqddTnkfmB7Afu9Ukwcx,0,null,null,null, 空,空,201

我已经接管了现有的Rails 3.2.9应用程序,并尝试在本地windows 7计算机上进行设置,但在尝试注册用户时出现以下错误:

ActiveRecord::语句在中无效 Workers::RegistrationControllerCreate

PG::Error:错误:列id中的null值与not null冲突 约束详细信息:

失败行包含null, 8f9f248b33a121ec83a38310,ZqddTnkfmB7Afu9Ukwcx,0,null,null,null, 空,空,2014-11-25 17:55:43.83172014-11-25 17:55:43.8317,空, dtest@gmail.com,null,null,null,null,null,null,null,null,null,null,null,null, 空,空,挂起,donnie,bertz,空,f,f,空,空,空, 空,空,空,test.com,yEqp4FV5XCKS9xaRnnwz,空,2014-11-25 17:55:43.8307,null,null,null,0,null,null,Work,null,null, null,null,null,f,null,f,null,0,0,null,f,0,null,f,0,null,null, 空,空,空:

插入用户活动、密钥、地址、, 管理员、可用性、可用性、内容类型、文件名、文件大小、, 更新日期、日历、员工、公司1、, 公司2,公司3,确认发送至, 确认令牌、确认令牌、创建令牌、, 当前登录地址、当前登录ip、数据、域、电子邮件、, 加密的\u密码、额外的\u链接、f1、失败的\u尝试、, 名字、全职、一般帮助、标题、介绍、, 作业数量、关键字、姓氏、最后请求时间、, 最后一次登录在,最后一次登录ip,l1,锁定在, 公制单位、选择权、密码、电话、信用、费率、, 评分计数,接收通信,记住在, 记住\u令牌、远程、重置\u密码\u发送到, 重置密码令牌、登录计数、化身url、状态、, 时区,t1,类型,未确认电子邮件,解锁令牌, 更新的、已使用的、视频url、向导步骤、zipcode 价值$1、$2、$3、$4、$5、$6、$7、$8、$9、$10、$11、$12、$13、$14, $15, $16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55, $56, $57、$58、$59、$60、$61、$62、$63、$64、$65、$66、$67返回id

最初,我收到一个ActiveRecord::NotNullViolation错误,并且:id字段包含在insert语句中。为了解决这个问题,我在用户模型中添加了self.primary_key=:id。这从insert中删除了:id,但我现在注意到,虽然insert语句在错误消息中看起来正常,“失败行”实际上有一个额外的列68,并且它们的顺序与insert语句中列出的顺序不同,insert语句按字母顺序列出了列

应用程序正在使用Desive和omniauth(如果其中任何一个相关)

schema.rb:

编辑1 SQL:

我还应该提到,最初的开发人员给出的唯一指示是首先手动创建Users表,以解决ActiveAdmin问题

编辑2-违规代码
您需要编写一个alter表迁移

首先,生成迁移

$ rails g migration add_uniqueness_to_users
打开迁移文件,并在其中执行以下操作:

class AddUniquenessToUsers < ActiveRecord::Migration
  def up
    change_column(:events, :id, 'SERIAL PRIMARY KEY')
    add_index :events, :id, :unique => true
  end
  def down
    remove_index :events, :id
    change_column(:events, :id, :integer)
  end
end

这就完成了您所需要的一切,将列类型更新为串行主键(这是对列进行增量更新所必需的),在列上添加了一个唯一的约束,并确保如果要在另一个方向上运行迁移,则会相应地发生相反的情况。

能否显示您的表定义?CREATETABLESQL语句,而不仅仅是您的rubymigration@pozs-额外的细节补充道,这真的很奇怪。Rails应该在Postgres中生成一个类似于自动递增的id列,它应该以串行而不是int形式键入-或者至少它应该有一个默认值,这是序列的下一个值-从您的CREATE表中看起来不是这样,这就是为什么您必须在INSERT语句中提供id,或者,它将违反NOTNULL约束。看起来该id未在Postgres中正确定义为串行主键。如果不将其声明为自动递增键,则必须在insert语句中提供其值。从SQL中删除id是朝着错误的方向移动的。您在上面写道,原始错误是ActiveRecord::NotNullViolation,但您没有说明错误是否指示了导致冲突的字段。也许你可以详细说明最初的错误?请参阅此参考:@aks-谢谢您的帮助。最后,您对原始错误的评论促使我回到起点,这一次,我按照正确的顺序找到了正确的步骤,并按照最初的编码,在没有任何调整的情况下启动并运行了所有步骤。谢谢你的建议,干杯。最后,对解决方案进行了概述。
class Employers::RegistrationsController < Devise::RegistrationsController
  def create
    super
    session[:omniauth] = nil unless @employer.new_record?
  end

  private

  def build_resource(*args)
    super
    if session[:omniauth]
      @employer.apply_omniauth(session[:omniauth])
    end
  end

  #Overwrite signin to make sure only users are signed in (for backward compatibility)
  def sign_in(resource_or_scope, *args)
    super(:user, *args)
  end

end
$ rails g migration add_uniqueness_to_users
class AddUniquenessToUsers < ActiveRecord::Migration
  def up
    change_column(:events, :id, 'SERIAL PRIMARY KEY')
    add_index :events, :id, :unique => true
  end
  def down
    remove_index :events, :id
    change_column(:events, :id, :integer)
  end
end