0

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

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

耙中止!

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

SQLite3::ConstraintException:唯一约束失败:favourites.user_id, favourites.tweet_id: CREATE UNIQUE INDEX "index_favourites_on_user_id_and_tweet_id" ON "favourites" ("user_id", "tweet_id")/Users/Tabish/.rvm/gems/ruby-2.2。 0/gems/sqlite3-1.3.10/lib/sqlite3/statement.rb:108:in `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

4

1 回答 1

1

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

要找到它们,请打开控制台并启动此命令,它会显示这些重复项:

Favourite.select('user_id, tweet_id').group(:user_id, :tweet_id).having('count(*) > 1')
于 2015-02-01T05:54:37.247 回答