Ответ 1
Героку использует драгоценный камень YamlDB
Я видел некоторые плагины и пользовательские задачи 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, использует его, мне не нужно беспокоиться о проблемах с поддержкой/долголетием.
Я предполагаю, что это ближе всего к "стандарту", который я найду.
Спасибо за все замечательные ответы.
Героку использует драгоценный камень YamlDB
Похоже, вы должны использовать 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.
нет Стандартного способа сделать это. Только стандартный способ загрузки светильников:
rake db:fixtures:load
Но в Интернете есть много примеров:
Он не использует точно такой же формат, как db: fixtures: load будет ожидать, но ar_fixtures делает сброс и загрузку данных как файлы YAML довольно легко.
Я думаю, что если стандартная информация администратора вам может быть лучше, чтобы поместить это в миграции. светильники в идеале должны использоваться только для тестирования.
Для кого-то, кто просто нашел это сейчас, я немного изменил ответ от @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