我怎么能检查表的存在

时间:2013-11-13 23:45:58

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

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

3 个答案:

答案 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