我很懒,因为我的生产数据库有我可以用来测试开发的数据,我想知道是否有任何 easy 方法来生成灯具。
在1.8.7上使用Rails 3
答案 0 :(得分:23)
问题是陈旧的,但仍然看似相关:是的,有一种从开发数据库创建灯具的简单方法:
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
将其放在config/initializers
中的文件中 - 现在您可以在Rails控制台中转储任何ActiveRecord对象,它将自动附加到它的相应夹具文件的末尾:
User.first.dump_fixture
将夹具数据附加到test/fixtures/users.yml
。
答案 1 :(得分:0)
如果要创建要在rails runner
下运行的脚本,则可以使用以下方法:
File.open("#{Rails.root}/spec/fixtures/documents.yml", 'w') do |file|
file.write Document.all.to_a.map(&:attributes).to_yaml
end
您可以根据需要创建任意数量的块,或者如果要转到完整的数据库,则可以尝试:
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
如果您不希望使用时间戳记,则可以将代码更改为:
model.all.to_a.map { |m| m.attributes.except('created_at', 'updated_at')}.to_yaml
答案 2 :(得分:0)
基于@nikolasgd 的回答,我写了一个 Rake Task,它可能对某些人有用:
# Use like "rake custom:create_test_fixtures[model]"
namespace :custom do
desc 'Re-Creates Fixtures for Testing for a Model'
task :create_test_fixtures, [:model] => [:environment] do |t, args|
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
begin
model = args[:model].constantize
model.all.map(&:dump_fixture)
puts "OK: Created Fixture for Model \"#{args[:model]}\"."
rescue NameError
puts "ERROR: Model \"#{args[:model]}\" not found."
end
end
end
答案 3 :(得分:-11)
你真的可以Google这个。 “rails从数据库创建夹具”。第一击:http://snippets.dzone.com/posts/show/2525。但是你会产生我认为是脆弱的测试。考虑使用夹具更换。与Fixjour,Factory Girl或Machinist一样。它们将帮助您思考您在代码中抛出的边缘情况。只是一个想法。