如何基于我的开发数据库生成灯具?

fiv*_*six 20 ruby-on-rails

我很懒,因为我的生产数据库有我可用于测试的数据,我想知道是否有任何简单的方法来生成灯具.

在1.8.7上使用Rails 3

小智 26

问题是陈旧的,但仍然看似相关:是的,有一种简单的方法可以从开发数据库创建灯具:

class ActiveRecord::Base
  def dump_fixture
    fixture_file = "#{Rails.root}/test/fixtures/#{self.class.table_name}.yml"
    File.open(fixture_file, "a+") do |f|
      f.puts({ "#{self.class.table_name.singularize}_#{id}" => attributes }.
        to_yaml.sub!(/---\s?/, "\n"))
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

将它放在一个文件中config/initializers- 现在你可以在你的Rails控制台中转储任何ActiveRecord对象,它将自动附加在它各自的fixture文件的末尾:

User.first.dump_fixture追加夹具数据test/fixtures/users.yml.

  • 好答案。对于那些希望将所有记录转储为固定资产的人,请使用上面的代码段:`User.all.map(&:dump_fixture)` (2认同)

Pau*_*lgo 6

如果您要创建要在其下运行的脚本,rails runner可以使用以下方法:

File.open("#{Rails.root}/spec/fixtures/documents.yml", 'w') do |file|
  file.write Document.all.to_a.map(&:attributes).to_yaml
end
Run Code Online (Sandbox Code Playgroud)

您可以根据需要创建任意数量的块,或者如果您想访问完整的数据库,您可以尝试:

models = defined?(AppicationRecord) ? ApplicationRecord.decendants : ActiveRecord::Base.descendants
models.each do |model|
  model_name = model.name.pluralize.underscore
  File.open("#{Rails.root}/spec/fixtures/#{model_name}.yml", 'w') do |file|
    file.write model.all.to_a.map(&:attributes).to_yaml
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您不需要时间戳,可以将代码更改为: model.all.to_a.map { |m| m.attributes.except('created_at', 'updated_at')}.to_yaml