ActiveRecord :: RecordNotUnique(PG ::错误:错误

时间:2012-04-13 23:48:30

标签: ruby-on-rails activerecord heroku

我在heroku上调用函数时遇到此错误,无法找出导致它崩溃的原因。 如您所见,该函数是在echos表中创建一个值。 奇怪的是,它在我的本地开发中运行良好。 下面是我的heroku日志。任何的想法???

  

在13毫秒内完成500内部服务器错误

     

ActiveRecord :: RecordNotUnique(PG ::错误:错误:重复键值违反了唯一约束“index_echos_on_user_id_and_yell_id”

     

INSERT INTO“echos”(“created_at”,“is_yell”,“latitude”,“longitude”,“updated_at”,“user_id”,“yell_id”)VALUES($ 1,$ 2,$ 3,$ 4,$ 5,$ 6 ,$ 7)返回“   ID“):


我尝试了validates_uniqueness_of,但它仍无效。

class Echo < ActiveRecord::Base
  belongs_to :user
  belongs_to :yell

  attr_accessible :user_id, :yell_id, :longitude, :latitude, :is_yell 
  validates_uniqueness_of :is_yell, :scope => [:yell_id, :user_id]
  validates :user_id, :yell_id, :presence => true
end

# == Schema Information
#
# Table name: echos
#
#  id         :integer(4)      not null, primary key
#  is_yell    :boolean(1)
#  user_id    :integer
#  yell_id    :integer
#  created_at :datetime
#  updated_at :datetime
#

3 个答案:

答案 0 :(得分:0)

您的唯一性约束允许(user_id,yell_id,is_yell) (1,1,true)(1,1,false),而UNIQUE索引会拒绝这组行。我不知道哪种方法对你的申请是正确的。

如果索引正确(任何user_id, yell_id组合最多一行),那么您应该更改验证:

validate_uniqueness_of :yell_id, :scope => :user_id

如果当前验证正确(允许同一个user_id, yell_id的叫喊和非叫喊),那么你应该删除索引并创建一个新索引:

remove_index :echo, [:user_id,:yell_id], :unique => true    
add_index :echo, [:user_id,:yell_id,:is_yell], :unique => true

答案 1 :(得分:0)

我很确定你正在制作一个非回调sql,比如update_all,这不会运行验证,所以你需要捕获错误并处理它

答案 2 :(得分:-1)

如果在数据库更新查询之前尝试避免保存重复项,该怎么办?我的意思是,在Echo模型上使用“validates_uniqueness_of”。

你正在这样做吗?你能在这里或在gist中粘贴Echo模型的源代码吗?

问候。