使用Devise模型播种SQLite会给出唯一性约束错误

时间:2015-07-07 21:26:28

标签: ruby-on-rails ruby devise

修改 真是愚蠢的错误:

db:reset seed the database。

我正在尝试播放数据库并创建有帖子的用户,但用户仍然违反唯一性约束......即使只有其中一个。

目前,我没有模型验证。

标准用户设计架构:

create_table "users", force: :cascade do |t|
  t.string   "email",                  default: "", null: false
  t.string   "encrypted_password",     default: "", null: false
  t.string   "reset_password_token"
  t.datetime "reset_password_sent_at"
  t.datetime "remember_created_at"
  t.integer  "sign_in_count",          default: 0,  null: false
  t.datetime "current_sign_in_at"
  t.datetime "last_sign_in_at"
  t.string   "current_sign_in_ip"
  t.string   "last_sign_in_ip"
  t.datetime "created_at",                          null: false
  t.datetime "updated_at",                          null: false
  t.string   "username"
end

add_index "users", ["email"], name: "index_users_on_email", unique: true
add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

分贝/ seeds.rb

1.times do |n|
email                           = Faker::Internet.email 
username                        = Faker::Name.name 
password                        = 'password' 
password_confirmation           = 'password' 
reset_password_token            = nil
id                              = n

User.create!(
    email:                  email,
    username:               username,
    password:               password,
    password_confirmation:  password_confirmation,
    reset_password_token:   reset_password_token,
    id: id          
)
end 

我运行了以下内容:

rails c 
rake db:reset
rake db:migrate
rake db:seed
>> ActiveRecord::RecordNotUnique: SQLite3::ConstraintException: UNIQUE constraint failed: users.id: INSERT INTO "users"

我只生成了一个用户但违反了唯一性。堆栈跟踪告诉我这是一个创建方法的问题,但我不知道如何解决这个问题。

我只有两个可能在数据库级别需要唯一的东西,那就是index_users_on_email和index_users_on_reset_password,如果数据库已被重置并仅用一个记录播种,则这两者都是唯一的。

我哪里错了?

1 个答案:

答案 0 :(得分:0)

以下是我为用户创建种子的方式,希望它有所帮助。

1.times do
    user = User.new(
      name:      Faker::Name.name,
      email:     Faker::Internet.email,
      password:  Faker::Lorem.characters(10)
    )
  user.skip_confirmation!
  user.save!
end

users = User.all