向模型添加唯一约束时迁移ERROR! "标准错误"?

时间:2015-02-01 04:25:24

标签: ruby-on-rails ruby sqlite ruby-on-rails-4.2

在我的rails应用程序中,我想为我的收藏夹模型添加一个独特的约束。 (我正在重建一个基本的Twitter应用程序,用户和推文,并为喜爱的人生成了第三个模型)。但是,当我尝试向我的收藏夹模型添加一个唯一约束,以便一个用户只能收到一条推文时,然后运行命令

rake db:migrate,我收到以下错误:

  

rake aborted!

     

StandardError:发生错误,此操作和所有后​​续迁移都已取消:

     

SQLite3 :: ConstraintException:UNIQUE约束失败:favourites.user_id,favourites.tweet_id:CREATE UNIQUE INDEX" index_favourites_on_user_id_and_tweet_id" ON"收藏夹" (" user_id"," tweet_id")/ Users / Tabish / .rvm / gems / ruby​​-2.2.0 / gems / sqlite3-1.3.10 / lib / sqlite3 / statement.rb :108:在'step'

以下是我创建的迁移文件的外观:

class AddUniqueConstraintToTweets < ActiveRecord::Migration
  def change
    add_index :favourites, [:user_id, :tweet_id], :unique => true
  end
end

此处还有我的收藏夹表格迁移文件:

class CreateFavourites < ActiveRecord::Migration
  def change
    create_table :favourites do |t|
      t.references :user, index: true
      t.references :tweet, index: true

      t.timestamps null: false
    end
    add_foreign_key :favourites, :users
    add_foreign_key :favourites, :tweets
  end
end

我正在使用Rails 4.2.0和SQLite3

1 个答案:

答案 0 :(得分:1)

正如@mu所提到的,这意味着您无法应用此索引,因为在当前数据库状态中,您有重复的user_id, tweet_id对。因此,您应该在运行迁移之前删除它们。

要查找它们,请打开控制台并触发此命令,该命令将显示这些重复项:

Favourite.select('user_id, tweet_id').group(:user_id, :tweet_id).having('count(*) > 1')