Check if a table exists in Rails

后端 未结 5 495
旧时难觅i
旧时难觅i 2021-01-29 19:35

I have a rake task that won\'t work unless a table exists. I\'m working with more than 20 engineers on a website so I want to make sure they have migrated the table before they

相关标签:
5条回答
  • 2021-01-29 19:52

    The proper way to do this is Model.table_exists?

    class Dog < ApplicationRecord
      # something
    end
    
    do_something if Dog.table_exists?
    
    0 讨论(0)
  • 2021-01-29 19:59

    I found this out while I was trying to remove a table via a migration:

    drop_table :kittens if (table_exists? :kittens)
    ActiveRecord::Migration.drop_table :kittens if (ActiveRecord::Base.connection.table_exists? :kittens)
    

    works for Rails 3.2

    This simpler form will become available in Rails 5:

    drop_table :kittens, if_exists: true
    

    Reference: https://github.com/rails/rails/pull/16366

    And here's the Rails 5 ActiveRecord's CHANGELOG:

    Introduce the :if_exists option for drop_table.

    Example:

    drop_table(:posts, if_exists: true)
    

    That would execute:

    DROP TABLE IF EXISTS posts
    

    If the table doesn't exist, if_exists: false (the default) raises an exception whereas if_exists: true does nothing.

    0 讨论(0)
  • 2021-01-29 20:07

    In Rails 5 the API became explicit regarding tables/views, collectively data sources.

    # Tables and views
    ActiveRecord::Base.connection.data_sources
    ActiveRecord::Base.connection.data_source_exists? 'kittens'
    
    # Tables
    ActiveRecord::Base.connection.tables
    ActiveRecord::Base.connection.table_exists? 'kittens'
    
    # Views
    ActiveRecord::Base.connection.views
    ActiveRecord::Base.connection.view_exists? 'kittens'
    

    In Rails 2, 3 & 4 the API is about tables.

    # Listing of all tables and views
    ActiveRecord::Base.connection.tables
    
    # Checks for existence of kittens table/view (Kitten model)
    ActiveRecord::Base.connection.table_exists? 'kittens'
    

    Getting the status of migrations:

    # Tells you all migrations run
    ActiveRecord::Migrator.get_all_versions
    
    # Tells you the current schema version
    ActiveRecord::Migrator.current_version
    

    If you need more APIs for migrations or metadata see:

    • ActiveRecord::SchemaMigration
      this is the ActiveRecord::Base class for the schema_migrations table
    • ActiveRecord::Migrator
      where all the action happens when migrations are run
    0 讨论(0)
  • 2021-01-29 20:14

    even if table is not exists:

    model Kitten, expected table kittens rails 3:

    Kitten.table_exists? #=> false

    0 讨论(0)
  • 2021-01-29 20:15

    Rails 5.1

    if ActiveRecord::Base.connection.data_source_exists? 'table_name'
       drop_table :table_name
    end
    

    or

    drop_table :table_name, if_exists: true
    
    0 讨论(0)
提交回复
热议问题