我在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
#
答案 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模型的源代码吗?问候。