我有大量需要运行的迁移文件,其中一些显然已经过时了。例如:
这失败了:
def self.up
create_table(:users) do |t|
t.database_authenticatable :null => false
...
出现此错误:
-- create_table(:users)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition
我认为因为Devise在撰写本文时已更新。
我还能做什么?
事实证明,这是一个模式文件。这是其中的一部分:
ActiveRecord::Schema.define(version: 20160221211458) do
create_table "activities", force: true do |t|
t.integer "user_id", null: false
t.string "target_type", default: "", null: false
t.integer "target_id", null: false
t.string "action", default: "", null: false
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "activities", ["target_id"], name: "index_activities_on_target_id_and_target_type", using: :btree
add_index "activities", ["user_id"], name: "index_activities_on_user_id", using: :btree
create_table "addresses", force: true do |t|
...
执行bundle exec rake db:schema:load
与尝试运行迁移之间的区别是什么。两者之间有区别吗?
此外,该数据库是一个mysql数据库:
# SQLite version 3.x
# gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
adapter: mysql2
database: arthouse_development
username: root
password:
host: localhost
port: 3306
#socket: /tmp/mysql.sock
运行bundle exec rake db:schema:load
答案 0 :(得分:1)
这失败了:
def self.up
create_table(:users) do |t|
t.database_authenticatable :null => false
我认为因为Devise在撰写本文时已更新。
我需要知道您收到的错误消息
结果是模式文件:
在您的架构中,我看到您没有users
表,我认为您need to check your db mysql2
并且看看您是否有某些内容。
执行
bundle exec rake db:schema:load
与尝试运行迁移之间的区别是什么?两者之间有区别吗?
让我们说我分叉了一个github项目,并且已经填充了schema
文件。使用该命令,我加载了模式,因此我不会运行每次迁移,只需像模式一样创建表。
迁移使用脚本填充数据库,此脚本具有add_column
之类的功能,可以修改schema.rb
文件。
来自ActiveRecord:Migrations的每个函数都将修改架构,这意味着可能会添加一列并稍后删除。迁移中的这种冲突是由于此迁移不兼容造成的,例如,您添加了一个列,然后需要将其反转,但稍后您要向该列添加索引,因此迁移失败。有关以下link
的更多信息迁移是一种以一致且简单的方式随时间改变数据库模式的便捷方式。他们使用Ruby DSL,因此您不必手动编写SQL,从而允许您的架构和更改独立于数据库。
您可以将每次迁移视为一个新的版本&#39;的数据库。架构一开始就没有任何内容,每次迁移都会修改它以添加或删除表,列或条目。 Active Record知道如何在此时间轴上更新您的架构,从历史记录中的任何位置到最新版本。 Active Record还将更新db / schema.rb文件以匹配数据库的最新结构。
您的错误
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
undefined method `database_authenticatable' for #<ActiveRecord::ConnectionAdapters::TableDefinition
鉴于您的问题,您应该找到解决方案
答案 1 :(得分:1)
当我尝试部署到新的登台服务器时,我也在现有应用上遇到了这个问题。
结果是Devise gem已经更新到2.1并且我没有修复迁移以使用新版本正常工作。
请务必阅读他们在wiki上迁移到2.1 doc的文档 - https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.1
另外,请务必仔细阅读文档,了解如何正确调整现有迁移 - https://github.com/plataformatec/devise/wiki/How-To:-Upgrade-to-Devise-2.0-migration-schema-style