Восстановить YAML Светильники из БД в Rails
Я использую Rails, и мои светильники YAML повреждены и непригодны для использования. Я хотел бы восстановить YAML светильники на основе базы данных разработки.
Я не пытаюсь взять все данные БД и превратить их в фиксатор. То, что я хочу, это воссоздать стандартные приборы, которые были созданы изначально, когда модели были созданы впервые.
Есть ли простой способ сделать это в Rails 4?
(Я видел эту страницу, на которой обсуждается, как сделать это [я думаю], создав задачу с граблями. Однако вопрос задан 3 года назад, и мне интересно, был ли создан более прямой метод.)
2 ответа
Там нет стандартного или очень элегантного способа.
Я использую этот фрагмент, когда мне нужно:
File.open("#{Rails.root}/spec/fixtures/users.yml", 'w') do |file|
data = User.all.to_a.map(&:attributes)
data.each{|x| x.delete('id')}
file.write data.to_yaml
end
Я написал грабли для этого.
https://gist.github.com/kuboon/55d4d8e862362d30456e7aa7cd6c9cf5
# lib/tasks/db_fixtures_export.rake
namespace 'db:fixtures' do
desc "generate fixtures from the current database"
task :export => :environment do
Rails.application.eager_load!
models = defined?(AppicationRecord) ? ApplicationRecord.decendants : ActiveRecord::Base.descendants
models.each do |model|
puts "exporting: #{model}"
# Hoge::Fuga -> test/fixtures/hoge/fuga.yml
filepath = Rails.root.join('test/fixtures', "#{model.name.underscore}.yml")
FileUtils.mkdir_p filepath.dirname
filepath.open('w') do |file|
hash = {}
model.find_each do |r|
key = r.try(:name) || "#{filepath.basename('.*')}_#{r.id}"
hash[key] = r.attributes.except(:password_digest)
end
file.write hash.to_yaml
end
end
end
end