Tengo una tarea de rake que no funcionará a menos que existe una tabla. Estoy trabajando con más de 20 ingenieros en una página web, así que queremos asegurarnos de que han migrado a la mesa antes de que puedan hacer una tarea rake que va a llenar la respectiva mesa.

¿ AR tienen un método como Table.exists? ¿Cómo puedo asegurarme de que han migrado a la mesa con éxito?

  • La broma va.. cuantos ingenieros se tarda para migrar de una mesa 🙂
  • En la producción de 1. En decenas de Ensayo y varias veces cada uno .
  • ¿No sería más fácil simplemente ejecutar las migraciones en el inicio de su tarea de rake? Así que usted no tiene que preocuparse acerca de la falta de tablas.
  • Tenga en cuenta que faltan tablas se va a dar un problema si la config/inicializadores uso de ellos. (es decir, incluso rake db:migrate fallará.)
InformationsquelleAutor thenengah | 2011-07-05

5 Comentarios

  1. 293

    En Rails 5 el La API se hizo explícito acerca de tablas/vistas, colectivamente fuentes de datos.

    # 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'

    En Rails 2, 3 & 4 de la API es acerca de tablas.

    # 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'

    Conseguir el estado de las migraciones:

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

    Si necesita más APIs para las migraciones o los metadatos ver:

    • ActiveRecord::Base.connection.table_exist 'users' comprobaría una tabla de usuarios.
    • Saludos @Codeglot, respuesta actualizada para incluir un argumento.
    • ActiveRecord::Base.connection.table_exists? 'kittens comprobaría un Gatito de la tabla. Que es menos que la que destruyó todos los gatitos! drop_table :kittens
    • Gracias chicos! Acabo de utilizar .index_exists?('kittens', 'paws')
    • Esto funciona para ActiveRecord 3.2.11 drop_table(:hosts_users) if table_exists? :hosts_users
    • current_version era justo lo que necesitaba para deshabilitar un modelo de método de tiempo suficiente para permitir que sus migraciones para que se ejecute cuando finalmente me implementado en la producción. Gracias!
    • ActiveRecord::Base.connection.data_source_exists? 'table_name' es el correcto ahora

  2. 54

    incluso si la tabla no existe:

    modelo Kitten, tabla esperado kittens
    rails 3:

    Gatito.table_exists? #=> false

    • esto no funciona.
    • +1 – NOTA: sólo Funciona para los Rieles de 3 o más.
    • + 1 solución Más elegante. También funciona si el modelo reemplaza el nombre de la tabla.
    • Confirmando esto funciona para los Raíles 2.3.18-lts (probado con una tabla, una falta antes de ejecutar el script/console)
  3. 32

    He encontrado esto mientras yo estaba tratando de quitar una tabla a través de una migración:

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

    obras para Rails 3.2

    Este sencillo formulario estará disponible en Rails 5:

    drop_table :kittens, if_exists: true

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

    Y aquí está el Rieles de 5 ActiveRecord del CHANGELOG:

    Introducir la :if_exists opción para drop_table.

    Ejemplo:

    drop_table(:posts, if_exists: true)

    Que ejecutar:

    DROP TABLE IF EXISTS posts

    Si la tabla no existe, if_exists: false (valor predeterminado), se obtiene una excepción, mientras que if_exists: cierto no hace nada.

    • Esto se producirá si la tabla está en el hecho de la vista, ya que la tabla va a aparecer, pero DROP TABLE no puede caer.
  4. 6

    Rieles 5.1

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

    o

    drop_table :table_name, if_exists: true
    • table_exists todavía funciona en rails-5, pero su comportamiento va a cambiar sólo de mesas. Como de 5.0.1 comprueba vistas y tablas. data_source_exists mantiene que el comportamiento y el table_exists va a cambiar sólo de mesas.
    • Él no está pidiendo para comprobar la tabla de migración, que necesita para asegurarse de que la tabla existe en una tarea rake
  5. 0

    La manera correcta de hacer esto es el Modelo.table_exists?

    class Dog < ApplicationRecord
      # something
    end
    
    do_something if Dog.table_exists?

Dejar respuesta

Please enter your comment!
Please enter your name here