Ruby on rails RubyonRails-生产中唯一的多键索引问题(HerokuPostgreSQL)

Ruby on rails RubyonRails-生产中唯一的多键索引问题(HerokuPostgreSQL),ruby-on-rails,postgresql,ruby-on-rails-4,indexing,key,Ruby On Rails,Postgresql,Ruby On Rails 4,Indexing,Key,我正面临一个我试图自己解决的问题,但我不知道哪里出了问题。我是法国人,所以我的模特,控制器。。。有法国名字 我正在为一个协会开发一个应用程序,这个协会每天晚上都会制造我们在法语中称之为“劫掠者”的东西:开车去见人 我有这个马劳德模型: class Maraude < ActiveRecord::Base default_scope -> { order(date: :desc) } validates :date, presence: true,

我正面临一个我试图自己解决的问题,但我不知道哪里出了问题。我是法国人,所以我的模特,控制器。。。有法国名字

我正在为一个协会开发一个应用程序,这个协会每天晚上都会制造我们在法语中称之为“劫掠者”的东西:开车去见人

我有这个马劳德模型:

class Maraude < ActiveRecord::Base
  default_scope -> { order(date: :desc) }
  validates :date,  presence: true,
                    uniqueness: { scope: :type_maraude }
  validates :type_maraude, presence: true
end
它在发展中发挥着完美的作用。在生产(Heroku)中,我创建了一个日期为2016-02-02的具有特定类型(maraude salariés 1)的maraude,当尝试在同一日期创建另一个具有不同类型的maraude时,我得到以下错误,我不明白它可能来自何处:

2016-02-05T13:56:51.810031+00:00 app[web.1]: Started POST "/maraudes" for 80.13.244.250 at 2016-02-05 13:56:51 +0000
2016-02-05T13:56:51.823195+00:00 app[web.1]:   Maraude Exists (0.9ms)  SELECT  1 AS one FROM "maraudes" WHERE ("maraudes"."date" = '2016-02-02' AND "maraudes"."type_maraude" = 'Maraude bénévoles') LIMIT 1
2016-02-05T13:56:51.812447+00:00 app[web.1]: Processing by MaraudesController#create as HTML
2016-02-05T13:56:51.829572+00:00 app[web.1]: Completed 500 Internal Server Error in 17ms (ActiveRecord: 5.9ms)
2016-02-05T13:56:51.819326+00:00 app[web.1]:   Maraude Load (0.9ms)  SELECT  "maraudes".* FROM "maraudes" WHERE "maraudes"."date" = $1 AND "maraudes"."type_maraude" = $2  ORDER BY "maraudes"."date" DESC LIMIT 1  [["date", "2016-02-02"], ["type_maraude", "Maraude bénévoles"]]
2016-02-05T13:56:51.812533+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"useo/o+NPJ6cemrRfdUN2LRIsDCAHiseYTlV2EKXigH/6C47ZzEhtM0mCra7EuY/QY/nZuXdpfnTDxR4VugUdw==", "maraude"=>{"date"=>"2016-02-02", "type_maraude"=>"Maraude bénévoles"}, "commit"=>"Créer la maraude"}
2016-02-05T13:56:51.828110+00:00 app[web.1]: DETAIL:  Key (date)=(2016-02-02) already exists.
2016-02-05T13:56:51.814745+00:00 app[web.1]:   User Load (0.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1  [["id", 1]]
2016-02-05T13:56:51.820512+00:00 app[web.1]:    (0.7ms)  BEGIN
2016-02-05T13:56:51.828073+00:00 app[web.1]:   SQL (1.6ms)  INSERT INTO "maraudes" ("date", "type_maraude", "villes", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["date", "2016-02-02"], ["type_maraude", "Maraude bénévoles"], ["villes", ""], ["created_at", "2016-02-05 13:56:51.823377"], ["updated_at", "2016-02-05 13:56:51.823377"]]
2016-02-05T13:56:51.828108+00:00 app[web.1]: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_maraudes_on_date"
2016-02-05T13:56:51.828111+00:00 app[web.1]: : INSERT INTO "maraudes" ("date", "type_maraude", "villes", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"
2016-02-05T13:56:51.829215+00:00 app[web.1]:    (0.9ms)  ROLLBACK
2016-02-05T13:56:51.832064+00:00 app[web.1]:
2016-02-05T13:56:51.832067+00:00 app[web.1]: ActiveRecord::RecordNotUnique (PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_maraudes_on_date"
2016-02-05T13:56:51.832068+00:00 app[web.1]: DETAIL:  Key (date)=(2016-02-02) already exists.
2016-02-05T13:56:51.832069+00:00 app[web.1]: : INSERT INTO "maraudes" ("date", "type_maraude", "villes", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"):
2016-02-05T13:56:51.832070+00:00 app[web.1]:   app/controllers/maraudes_controller.rb:34:in `create'
PG错误似乎表明它的行为就像我在
:date
上创建了一个唯一的索引,但事实并非如此

这里的信息是我在我的掠夺者控制器中的“创建”操作。 编辑:我翻译了flash消息

def create
  @maraude = Maraude.new(maraude_params)
  @maraude.villes = ""
  if Maraude.find_by(date: params[:maraude][:date], type_maraude: params[:maraude][:type_maraude])
    flash[:danger] = "This maraude already exists"
    redirect_to new_maraude_path
  elsif @maraude.save
    flash[:success] = "Maraude created"
    redirect_to id_m_villes_path(id: @maraude.id)
  else  
    flash[:danger] = "Give date and maraude type"
    redirect_to new_maraude_path
  end
end

谢谢你的帮助

嗨,埃利。我不是很清楚这个问题是从哪里来的,但是,阅读日志就像你的db索引不包括“maraude_id”,而只包括“date”。如果是我,我会尝试用控制台或Heroku上的某个db管理器直接查询数据库,以确保索引配置。。。尝试插入数据以验证错误是否确实取决于数据库。在两种环境中使用相同的数据库?也许你需要在Heroku上添加一个插件?博恩·劳弗:)谢谢你的回答!该模型确实包含默认id,因为我经常使用它。请参见我的创建操作:我使用maraude的id创建了一条路线,指向一个页面,您可以在该页面上发布maraude所经过的城市,没有问题。明天我会找一个db经理,谢谢。两种环境上的数据库相同。我不认为我需要一个附加组件,heroku是尽可能简单的,我一直在寻找我的问题的答案,没有人谈论宝石或任何应该解决这个问题的东西。另外,我在另一个模型上使用相同类型的索引,也没有问题!
def create
  @maraude = Maraude.new(maraude_params)
  @maraude.villes = ""
  if Maraude.find_by(date: params[:maraude][:date], type_maraude: params[:maraude][:type_maraude])
    flash[:danger] = "This maraude already exists"
    redirect_to new_maraude_path
  elsif @maraude.save
    flash[:success] = "Maraude created"
    redirect_to id_m_villes_path(id: @maraude.id)
  else  
    flash[:danger] = "Give date and maraude type"
    redirect_to new_maraude_path
  end
end