2016-09-06 3 views
0

Я создал демоверсию моей программы. Демонстрация используется для представления программы клиентам. Перед каждой презентации я хочу сбросить БД, и вставить некоторые данные, действия, которые я должен сделать это:Сбросить DB из контроллера/помощника, Ruby on Rails

rake db:drop 
rake db:setup 
rake db:seed:demo 

Но они не всегда мне представить его, а другие не использовать консоль, так что я хотел поставить на страницу настроек возможность сброса с помощью кнопки.

Я пытался таким образом:

module SettingsHelper 
require 'rake' 
    def reset 
     Rake::Task[db:drop].invoke 
     Rake::Task[db:setup].invoke 
     Rake::Task[db:seeds:demo].invoke 
    end 
end 

Я положил в форме:

<%=button_to "Reset", reset, class:"btn red" %> 

Но я не могу удалить базу данных с активным сервером ... как я могу сделать?

+0

Вы не можете удалить базу данных, если у вас есть активное соединение. Что вы можете сделать, так это уничтожить все записи и создать новые записи –

+0

ok, и как я могу назвать семя для создания записи? –

+1

'Rails.application.load_seed' –

ответ

0

Я истреблю код из следующих SO отвечает

Вы можете добавить что-то вроде этого в контроллере

def reset_db 
    conn = ActiveRecord::Base.connection 
    tables = ActiveRecord::Base.connection.tables 
    tables.each { |t| conn.execute("TRUNCATE #{t}") } 

    Rails.application.load_seed 
end 
+0

Спасибо, это хорошая идея, но у меня есть проблема, потому что я использую Postgresql, и id не всегда начинается с 1, в противном случае отношения в семени не работают ... Как можно Я установил первый id 1? Я думаю, что это функция, называемая «sequence» –

+0

Я пробовал эту функцию, но она дает мне эту ошибку: 'PG :: UndefinedObject: ERROR: непризнанный параметр конфигурации« таблицы »: show tables' –

+0

В postgres свой' SELECT tablename FROM pg_tables' но вы также можете использовать более высокий уровень 'ActiveRecord :: Base.connection.tables', который предоставляется адаптером. – max

0

Вы не можете оставить базу данных, пока у вас активное соединение. Вместо этого вы можете сделать команду TRUNCATE, которая удалит все строки из таблицы и сбросит столбцы идентификаторов.

Incase вы хотите более мелкозернистого контроль над точно, какие таблицы усечены вы можете добавить метод класса модели:

class User < ActiveRecord::Base 
    self.truncate! 
    self.connection.execute(
     "TRUNCATE TABLE #{ self.table_name };" 
    ) 
    self.connection.reset_pk_sequence!(self.table_name) 
    end 
end 

Но позволяет DRY его в модуль таким образом, мы не должны повторять это во всех моделях, которые должны иметь такое поведение:

# app/models/concerns/resetable.rb 
module Resetable 
    extend ActiveSupport::Concern 
    class_methods do 
    def truncate! 
     self.connection.execute(
     "TRUNCATE TABLE #{ self.table_name };" 
    ) 
     self.connection.reset_pk_sequence!(self.table_name) 
    end 
    end 
end 

# app/models/user.rb 
class User < ActiveRecord::Base 
    include Resetable 
    # ... 
end 

# app/models/book.rb 
class Book < ActiveRecord::Base 
    include Resetable 
    # ... 
end 
# ... 

Вы можете сбросить данные для каждой модели по:

def reset_db 
    [User, Book, Thing].each { |model| model.truncate! } 
    Rails.application.load_seed 
end 

Если вы просто хотите, чтобы ядерное оружие всех таблиц, вы можете просто сделать:

ActiveRecord::Base.connection.tables.each do |t| 
    conn = ActiveRecord::Base.connection 
    conn.execute("TRUNCATE TABLE #{t} CASCADE;") 
    conn.reset_pk_sequence!(t) 
end 
+0

'TRUNCATE ... CASCADE' является специальным способом Postgres для усечения таблицы, даже если существует ограничение внешнего ключа. – max

+0

Я включил «Сброс» в контроллер и поместил функцию в «помощник», у меня есть эта ошибка: 'undefined method' truncate! ' для # <Класс: 0x00559615887830> ', а переменная модель - Student, первая модель, которую я прошел –

+0

Модули и помощники - это не одно и то же. Вышеупомянутый модуль, который смешивается с классом модели для его расширения. Хелпер смешивается с контроллером, который не то, что вы хотите. – max