GitHub与朋友一起启动了Rails狂轰滥炸项目,我们使用Ι进行版本控制。
我已经在我的机器中创建了示例项目,并在其上安装了任意的功能。这将创建一个包含示例产品的数据库,如下所示:

当我的朋友在他的机器中复制项目并导入它时,运行rails server的MigrationException会失败,并要求他运行rake db:migrate。
在一些迁移之后,在不存在的db列上运行rake db:migrate失败。
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: no such column: spree_calculators.deleted_at: SELECT "spree_calculators".* FROM "spree_calculators" WHERE "spree_calculators"."deleted_at" IS NULL ORDER BY "spree_calculators"."id" ASC LIMIT 1000C:in `find_each'
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:15:in `migrate_preferences'
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:4:in `up'
C:in `migrate'
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: spree_calculators.deleted_at: SELECT "spree_calculators".* FROM "spree_calculators" WHERE "spree_calculators"."deleted_at" IS NULL ORDER BY "spree_calculators"."id" ASC LIMIT 1000
C:in `find_each'
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:15:in `migrate_preferences'
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:4:in `up'
C:in `migrate'
SQLite3::SQLException: no such column: spree_calculators.deleted_at
C:in `find_each'
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:15:in `migrate_preferences'
C:/Users/User/xylino/xylino_serena/db/migrate/20151011115236_migrate_old_preferences.spree.rb:4:in `up'
C:in `migrate'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)之后,再次运行rails server是成功的,但是在他的示例页面中看不到任何产品或其他项目,如下所示:

数据库一定有问题。部分或全部是不可访问的,可能是由于安全问题,因为我们共享数据库,但我找不到解决方案。或者这只是一个拙劣的迁移问题
有什么想法吗?
发布于 2015-10-22 00:15:22
Rails迁移有时会随着您的生活环境而过时。如果您有一个单独的数据库团队来更新您的生产环境并忘记对其进行迁移,则可能会发生这种情况。如果您更新您的迁移,忘记重新运行它们,或者在某种程度上处于不一致的状态,也会发生这种情况。
要做到这一点,最好的方法是让项目的新开发人员运行rake db:schema:load。这将从db/schema.rb文件中加载数据库结构,该文件将尽可能地更新所有内容。之后,您可以运行rake db:migrate来验证所有的东西都迁移了。
但是,在此之后,您将拥有数据库的结构,而不是数据库的内容。因此,假设您有一个以dimitris@example.com作为用户的user表。您的同事将有一个没有用户的users表。
要解决这个问题,您可以编辑db/seeds.rb文件。在那里,你可以做这样的事情:
User.create(name: 'Dimitris Sfounis', email: 'dimitris@example.com', password: 'password123')
User.create(name: 'Some Colleague', email: 'colleague@example.com', password: 'password123')
Product.create(name: 'Ruby on Rails Tote', price: 15.99)
Product.create(name: 'Ruby on Rails Bag', price: 22.99)这里的想法是创建演示数据,足以在一个全新的空数据库中启动、运行和测试一些东西。在此之后,rake db:seed将提供足够的数据来运行该应用程序。
如果这还不够好,并且您希望所有开发人员都能得到数据库的确切副本,那么您可以上传您的SQLite数据库,并让每个开发人员在他们将数据库解压缩时下载一个新副本。但是,这很难管理,因为每次有人用新的迁移更新主分支时,都需要更新SQLite文件。对于其他数据库,可以使用pg_dump (Postgres)或mysqldump (MySQL)转储和还原。
发布于 2015-10-26 15:41:27
如果您在您的机器上使用sqlite3启动了一个新的rails/spree项目(让我们称之为机器A),而您的朋友希望在机器B上使用相同的代码,那么您必须记住一些事情:
存储在db/下的..sqlite3 3-文件由rails生成器自动添加到.gitignore文件中。
...
# Ignore the default SQLite database.
/db/*.sqlite3
/db/*.sqlite3-journal
...所以你的朋友甚至没有得到数据库,如果你没有改变.gitignore (我不建议这样做,因为在部署时你不想在你的生产服务器上拥有开发工具)
工作流程应是:
rake db:migrate。db/seeds.rb并调用rake db:seed希望这有助于理解
https://stackoverflow.com/questions/33101806
复制相似问题