Rails'te bir tablonun olup olmadığını kontrol edin


174

Bir tablo yoksa sürece işe yaramaz bir komisyon görev var. Bir web sitesinde 20'den fazla mühendis ile çalışıyorum, bu yüzden ilgili tabloyu dolduracak bir komisyon görevi yapmadan önce tabloyu taşıdıklarından emin olmak istiyorum.

AR'nin böyle bir yöntemi var mı Table.exists? Tabloyu başarıyla taşıdıklarından nasıl emin olabilirim?


12
Şaka gider .. bir masa taşımak için kaç mühendis alır :)
Zabba

1
Üretimde 1. Evreleme Üzerine Düzinelerce ve birden çok kez.
thenengah

2
Komisyon görevinizin başlangıcında taşıma işlemlerini gerçekleştirmek daha kolay olmaz mıydı? Yani eksik masalar için endişelenmenize gerek yok.
raskhadafi

@raskhadafi: Yapılandırma / başlatıcılarınız bunları kullanıyorsa eksik tabloların size bir sorun vereceğini unutmayın. (yani rake db:migratebaşarısız olur.)
ocodo 23:16

Yanıtlar:


302

Rails 5'te API, tablolar / görünümler ve toplu olarak veri kaynakları konusunda açık hale geldi .

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

Rails 2, 3 ve 4'te API tablolarla ilgilidir .

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

Taşımaların durumunu alma:

# Tells you all migrations run
ActiveRecord::Migrator.get_all_versions

# Tells you the current schema version
ActiveRecord::Migrator.current_version

Taşıma işlemleri veya meta veriler için daha fazla API'ya ihtiyacınız varsa bkz:


4
ActiveRecord::Base.connection.table_exist 'users'bir kullanıcı tablosu olup olmadığını kontrol eder.
thenengah

4
ActiveRecord::Base.connection.table_exists? 'kittensbir Kitten tablo kontrol eder. Bütün yavruları yok etmediğim sürece! drop_table :kittens
thenengah

1
Teşekkürler beyler! Ben sadece kullandım.index_exists?('kittens', 'paws')
Seyahat

14
Bu ActiveRecord 3.2.11 drop_table(:hosts_users) if table_exists? :hosts_users
Greg

1
ActiveRecord::Base.connection.data_source_exists? 'table_name'şimdi doğru
Dorian

57

tablo olmasa bile:

model Kitten, beklenen tablo kittens rayları 3:

Kitten.table_exists? # => yanlış


+ 1 Daha şık bir çözüm. Model tablo adını geçersiz kılarsa da çalışır.
Daniel Rikowski

1
Bunun Rails 2.3.18-lts için çalıştığını onaylama (bir tablo mevcut, bir komut dosyası / konsol çalıştırmadan önce eksik)
iheggie

32

Bir taşıma yoluyla bir tabloyu kaldırmaya çalışırken bunu öğrendim:

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

Rails 3.2 için çalışır

Bu daha basit form Rails 5'te sunulacaktır:

drop_table :kittens, if_exists: true

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

Ve işte Rails 5 ActiveRecord'un CHANGELOG'u :

Drop_table için: if_exists seçeneğini tanıtın.

Misal:

drop_table(:posts, if_exists: true)

Bu yürütür:

DROP TABLE IF EXISTS posts

Tablo yoksa, if_exists: false (varsayılan) bir istisna oluşturur; if_exists: true ise hiçbir şey yapmaz.


Tablonun bir görünüm olması durumunda, tablonun var olduğu anlaşılacağı için bu başarısız olur, ancak DAMLA TABLOSU bunu bırakamaz.
mcr

8

Raylar 5.1

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

veya

drop_table :table_name, if_exists: true

2
table_exists hala raylar-5'de çalışır, ancak davranışı yalnızca tabloları kontrol edecek şekilde değişecektir. 5.0.1'den itibaren görünümleri ve tabloları kontrol eder. data_source_exists, davranışın ve table_exists'in yalnızca kontrol tablolarına değişeceğini belirtir.
John Naegle

Bir göçle ilgili masayı kontrol etmek istemiyor, masanın bir komisyon görevinde bulunduğundan emin olması gerekiyor
Juan Furattini

0

Bunu yapmanın doğru yolu Model.table_exists?

class Dog < ApplicationRecord
  # something
end

do_something if Dog.table_exists?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.