Регенерация фикстур YAML из БД в Rails

Я использую Rails, и мои приборы YAML повреждены и непригодны для использования. Я хотел бы восстановить приборы YAML на основе базы данных разработки.

Я не пытаюсь взять все данные БД и превратить их в фикстуру. Я хочу воссоздать стандартные приборы, которые были созданы изначально при первом создании моделей.

Есть ли простой способ сделать это в Rails 4?

(Я видел эту страницу, на которой обсуждается, как это сделать [я думаю] с помощью создание задачи rake.Однако вопрос был создан 3 года назад, и мне интересно, был ли еще создан более прямой метод.)


person Jo.P    schedule 20.08.2015    source источник
comment
Я думаю, вам следует попробовать использовать тот ответ, который вы связали. Я действительно сомневаюсь, что есть лучший способ сделать то, что вы просите. Это не обычный вариант использования.   -  person Toby 1 Kenobi    schedule 20.08.2015
comment
Попытка… и неудача. :/ Я смотрю на create_fixtures(), но не могу понять, как его использовать из-за отсутствия документации...   -  person Jo.P    schedule 21.08.2015


Ответы (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
person EugZol    schedule 20.08.2015
comment
Это очень полезный ответ! (Связанный ответ не работал у меня должным образом) - person Jo.P; 21.08.2015

Я написал rake task для этого.

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
person kuboon    schedule 12.05.2017