Как загрузить задачи базы данных ActiveRecord в проекте Ruby за пределами Rails?

ActiveRecord 3.2.14

Я хочу использовать ActiveRecord в проекте Ruby Ruby без Rails. Я хочу иметь доступ к задачам rake, которые определяются ActiveRecord. Как я могу это сделать?

rake db:create           # Create the database from DATABASE_URL or config/database.yml for the current Rails.env (use db:create:all to create all dbs in the config)
rake db:drop             # Drops the database using DATABASE_URL or the current Rails.env (use db:drop:all to drop all databases)
rake db:fixtures:load    # Load fixtures into the current environment database
rake db:migrate          # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status   # Display status of migrations
rake db:rollback         # Rolls the schema back to the previous version (specify steps w/ STEP=n)
rake db:schema:dump      # Create a db/schema.rb file that can be portably used against any DB supported by AR
rake db:schema:load      # Load a schema.rb file into the database
rake db:seed             # Load the seed data from db/seeds.rb
rake db:setup            # Create the database, load the schema, and initialize with the seed data (use db:reset to also drop the db first)
rake db:structure:dump   # Dump the database structure to db/structure.sql
rake db:version          # Retrieves the current schema version number

Вышеприведенный список - это список задач, которые я хочу использовать для моего проекта Rails Ruby, который использует ActiveRecord. Что мне нужно написать в моем Rakefile?

Заранее спасибо

Ответ 2

Самое простое - загрузить задачи, уже определенные в databases.rake. Вот GIST, как это было сделано.

Вдохновленный этим GIST от Drogus

Rakefile.rb

require 'yaml'
require 'logger'
require 'active_record'

include ActiveRecord::Tasks

class Seeder
  def initialize(seed_file)
    @seed_file = seed_file
  end

  def load_seed
    raise "Seed file '#{@seed_file}' does not exist" unless File.file?(@seed_file)
    load @seed_file
  end
end


root = File.expand_path '..', __FILE__
DatabaseTasks.env = ENV['ENV'] || 'development'
DatabaseTasks.database_configuration = YAML.load(File.read(File.join(root, 'config/database.yml')))
DatabaseTasks.db_dir = File.join root, 'db'
DatabaseTasks.fixtures_path = File.join root, 'test/fixtures'
DatabaseTasks.migrations_paths = [File.join(root, 'db/migrate')]
DatabaseTasks.seed_loader = Seeder.new File.join root, 'db/seeds.rb'
DatabaseTasks.root = root

task :environment do
  ActiveRecord::Base.configurations = DatabaseTasks.database_configuration
  ActiveRecord::Base.establish_connection DatabaseTasks.env.to_sym
end

load 'active_record/railties/databases.rake'

Ответ 3

Для Rails 3.x:

Вам нужно вручную создать задачи. В качестве примера можно привести их добавление (в этом примере используются переменные среды, такие как Rails):

  namespace :db do
    desc "Drop and create the current database"
    task :recreate => :environment do
      abcs = ActiveRecord::Base.configurations
      ActiveRecord::Base.establish_connection(abcs[RAILS_ENV])
      ActiveRecord::Base.connection.recreate_database(ActiveRecord::Base.connection.current_database)
    end
  end

и у вас будет доступная задача rake db:recreate

Для Rails 4.x:

Если вы хотите, чтобы задачи rake ActiveRecord были доступны в вашем рубиновом приложении, просмотрите документацию .

Пример использования DatabaseTasks вне Rails может выглядеть следующим образом:

include ActiveRecord::Tasks
DatabaseTasks.database_configuration = YAML.load(File.read('my_database_config.yml'))
DatabaseTasks.db_dir = 'db'
# other settings...

DatabaseTasks.create_current('production')

Также у вас здесь пример использования ActiveRecord в вашем рубиновом применении.

Ответ 4

Создайте свой собственный! Ссылка на Rails, хотя:

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/railties/databases.rake

  • Создайте файл задачи Rake. Чтобы использовать Rake, обычно вам нужна папка задач, заполненная файлами задач Rake. Эти файлы имеют расширение ".task".
  • Изучите файл для ссылки.
  • Возьмите части этого файла или даже все содержимое файла и добавьте его в новый файл задачи Rake.
  • Убедитесь, что ваш файл Rakefile загружает эти файлы задач. Ваш Rakefile должен иметь что-то вроде этого

-

Dir[File.join(PROJECT_ROOT,  'tasks', '**', '*.rake')].each do |file|
  load file
end

Ответ 5

Если вы используете Sinatra, вы можете использовать этот драгоценный камень:

https://github.com/janko-m/sinatra-activerecord

Однако, если вы его также не используете, исходный код внутри является хорошим примером того, как выполнять AR-рейки.