Подтвердить что ты не робот

Каков стандартный способ сбрасывать db на yml-светильники в рельсах?

Я видел некоторые плагины и пользовательские задачи rake, чтобы сбрасывать активные db на светильники, но я не уверен, что такое преобладающая техника.

В принципе, я хочу противопоставить rake: db: fixtures: load, чтобы я мог поместить базовую информацию db (учетную запись пользователя администратора для одного) в svn для развертывания. Я не хочу создавать инструменты вручную для таких вещей, как данные образца, которые занимают много времени.

Когда мы развертываем, я хочу иметь возможность запускать

rake db:migrate
rake db:fixtures:load

И отправляйтесь на гонки.

Каков наилучший/предпочтительный метод для этого в рельсах?

EDIT:

Итак, похоже, что нет стандартного способа выполнить противоположную задачу rake db: fixtures: load.

Я не хочу использовать миграции, потому что мне нужен стандартный способ сделать это для всех моих проектов, и мне не нравится идея помещать больше, чем, возможно, учетную запись администратора при переносе. Во-вторых, я переосмыслил идею использования светильников. Я решил использовать yaml_db, потому что он использует задачи rake:

rake db:data:dump
rake db:data:load

Данные закроются в файле YAML, не прерывая тестовые приборы (что может быть другим, теперь, когда я думаю об этом более тщательно). Кроме того, если основной инструмент распространения, такой как Heroku, использует его, мне не нужно беспокоиться о проблемах с поддержкой/долголетием.

Я предполагаю, что это ближе всего к "стандарту", ​​который я найду.

Спасибо за все замечательные ответы.

4b9b3361

Ответ 2

Похоже, вы должны использовать db/seeds.rb и соответствующую команду rake db: seed. Они разработаны специально для загрузки данных семян. Затем вы можете звонить на YamlDB для загрузки данных и рейка db: data: dump_dir, чтобы сбросить все приборы во временный каталог и скопировать их в каталог исходных данных по мере необходимости.

Обратите внимание, что это НЕ работает для сброса светильников, так как формат YAML отличается. ar_fixtures, отмеченное выше, не работает с Rails 3 и, похоже, больше не поддерживается. Для сброса светильников вы можете попробовать что-то подобное в lib/tasks/dump_fixtures.rake:

namespace :db do
  namespace :fixtures do    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Specify RAILS_ENV=production on command line to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s"
      skip_tables = ["schema_migrations"]
      ActiveRecord::Base.establish_connection(Rails.env)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", 'w') do |file|
          data = ActiveRecord::Base.connection.select_all(sql % table_name)
          file.write data.inject({}) { |hash, record|
            hash["#{table_name}_#{i.succ!}"] = record
            hash
          }.to_yaml
        end
      end
    end
  end
end

Я нашел здесь здесь и немного изменил его для Rails3.

Ответ 4

Он не использует точно такой же формат, как db: fixtures: load будет ожидать, но ar_fixtures делает сброс и загрузку данных как файлы YAML довольно легко.

Ответ 5

Я думаю, что если стандартная информация администратора вам может быть лучше, чтобы поместить это в миграции. светильники в идеале должны использоваться только для тестирования.

Ответ 6

Для кого-то, кто просто нашел это сейчас, я немного изменил ответ от @jpgeek. Включите таблицу schema_migration в список игнорирования и порядок по идентификатору, чтобы я получал результат table_name_001 для ID=1

namespace :db do
  namespace :fixtures do    
    desc 'Create YAML test fixtures from data in an existing database.  
    Defaults to development database.  Specify RAILS_ENV=production on command line to override.'
    task :dump => :environment do
      sql  = "SELECT * FROM %s ORDER BY ID"
      skip_tables = ["schema_info", "schema_migrations"]
      ActiveRecord::Base.establish_connection(Rails.env)
      (ActiveRecord::Base.connection.tables - skip_tables).each do |table_name|
        i = "000"
        File.open("#{Rails.root}/test/fixtures/#{table_name}.yml.new", 'w') do |file|
          data = ActiveRecord::Base.connection.select_all(sql % table_name)
          file.write data.inject({}) { |hash, record|
            hash["#{table_name}_#{i.succ!}"] = record
            hash
          }.to_yaml
        end
      end
    end
  end
end