HY
很多时候我运行rake db:migrate我得到一个错误,因为表用户或foor或bar存在。 我试图检查表的存在,但这不起作用,我不知道为什么。 我使用rails 3.2.2
class AddDeviseToUsers < ActiveRecord::Migration
#def self.table_exists?(users)
# ActiveRecord::Base.connection.tables.include?(users)
#end
if !table_exists?("users")
def change
create_table(:users) do |t|
## Database authenticatable
t.string :email, :null => false, :default => ""
t.string :encrypted_password, :null => false, :default => ""
end
end
end
答案 0 :(得分:8)
您可以使用以下命令检查表的存在。此问题已发布并已回复here。
ActiveRecord::Base.connection.table_exists? 'users'
但是,您的代码包含错误。您无法使用您正在使用的语法在if
块内定义方法。将块放在方法中,而不是。
def change
if !table_exists?("users")
# ...
end
end
此外,正如您所说,您不应经常遇到此类错误。迁移按顺序应用。在向其添加Devise之前,在单独的迁移中创建users
表将解决该问题。如果您在从头开始迁移现有项目时遇到此问题,请考虑使用rake db:schema:load
代替。
答案 1 :(得分:0)
在命令终端中键入
sqlite3 db/development.sqlite3
然后你可以通过SQL命令搜索你的数据库。使用.tables
列出数据库中的所有表,您可以查看是否缺少您的表。
您还可以查看架构文件以查看迁移是否有效。该表及其所有属性将列在那里。
答案 2 :(得分:-1)
您永远不应该尝试创建同一个表的多个迁移。如果您正确使用rails迁移,也不应该遇到这样的错误。
rails迁移的工作方式是每次运行rake db:migrate
时,对于每个成功运行的迁移文件,它都会将迁移文件123456789_create_users_table.rb
的编号部分(在本例中为123456789)存储在数据库中名为schema_migrations
的表。这样,如果已经运行了迁移,它将永远不会再次运行。
听起来您并没有正确使用rails迁移。我建议彻底阅读:http://guides.rubyonrails.org/migrations.html