15

活动记录 3.2.14

我想在非 Rails Ruby 项目中使用 ActiveRecord。我想使用 ActiveRecord 定义的 rake 任务。我怎样才能做到这一点?

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

上面的列表是我希望能够在使用 ActiveRecord 的非 Rails Ruby 项目中使用的任务列表。我必须在我的 Rakefile 中写什么?

提前致谢

4

6 回答 6

21

最简单的做法是加载已在 databases.rake 中定义的任务。这是如何完成的 GIST。

受到Drogus 的 GIST 的启发

瑞克文件.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'
于 2014-09-25T19:10:39.267 回答
6

您可以尝试独立迁移 gem: https ://github.com/thuss/standalone-migrations

于 2014-07-19T13:10:23.280 回答
2

对于 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:

如果您想在您的 ruby​​ 应用程序中使用 ActiveRecord rake 任务,请查看文档

在 Rails 之外使用 DatabaseTasks 的示例如下所示:

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

DatabaseTasks.create_current('production')

此外,您还有一个关于如何在您的 ruby​​ 应用程序中使用 ActiveRecord 的示例

于 2013-10-06T11:55:46.523 回答
2

创建你自己的!参考 Rails 之一:

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

  1. 创建一个 Rake 任务文件。要使用 Rake,通常需要一个包含 Rake 任务文件的任务文件夹。这些文件具有“.task”扩展名。
  2. 研究给定链接的文件。
  3. 获取该文件的一部分,甚至文件的全部内容,并将其添加到新的 Rake 任务文件中。
  4. 确保您的 Rakefile 加载了这些任务文件。你的 Rakefile 应该有这样的东西

-

Dir[File.join(PROJECT_ROOT,  'tasks', '**', '*.rake')].each do |file|
  load file
end
于 2014-01-16T01:04:58.010 回答
2

我相信sinatra-activerecord即使您不使用 Sinatra,您也可以使用 gem。我只是通过要求该 gem 然后添加来解决了这个问题

require 'sinatra/activerecord/rake'

到我的rakefile.

一旦我添加了该require行,db任务就会出现在我的rake -T!

于 2019-02-09T23:48:50.960 回答
1

如果你使用 Sinatra,你可以使用这个 gem:

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

但是,如果你也不使用它,里面的源代码提供了一个很好的例子来说明如何实现 AR rake 任务。

于 2013-10-06T08:31:16.883 回答