Ruby on Rails:非常快速地填充虚假数据

时间:2013-11-29 00:32:13

标签: mysql ruby-on-rails ruby faker

我可以想象,对于像我这样的懒人,只需使用一个rake(终端)命令就可以将任何伪数据填充到db中,这非常容易。

我了解Faker,Populator和其他人,但据我所知,所有人都需要编写一些(原始的)代码来使数据更加人性化(直接和手动定义随机数据的类型:emalis,名称,价格等)。

在大多数情况下这是有意义的,但现在在我的情况下,我可以用任何字符串填充mysql varchar字段,用任何长文本填充文本字段,int - 用数字等等

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果速度是你的目标,你应该做两件事:

  • 在进行验收测试之前,请使用内存数据库进行测试。换句话说,考虑使用类似于SQLite的集成测试(有些人可能会说单元测试而不是MySQL)。
  • 使用Factory Girl生成虚假数据。显然,像这样的工具创建的数据比你喜欢的更有意义,但是你关心的是我很奇怪。无论如何,使用现有工具比编写生成乱码的代码要快得多,因为您不希望数据看起来“太好”。

答案 1 :(得分:0)

一些示例代码,说明如何执行此操作:

SKIP_COLUMNS = %w(id created_at updated_at)
RECORDS_COUNT = 10

# random data to fill
int = rand(1..100)
varchar = 'lorem'
text = 'big lorem'

# get models
@models = ActiveRecord::Base.connection.tables.collect {|t| t.underscore.singularize.camelize }
@models.select {|m| m.constantize rescue @models.delete(m) }

# fill in data
@models.map(&:constantize).each do |model|
  model.columns_hash.each do |column|
    next if SKIP_COLUMNS.include?(column.first)

    # column_name = column.first
    # column_type = column.last.type

    RECORDS_COUNT.times do
      record = model.new

      case column.last.type
      when :integer
        record.send("#{column.first}=", int) 
      when :string
        record.send("#{column.first}=", varchar) 
      when :text
        record.send("#{column.first}=", text) 
      end

      record.save!
    end
  end
end

你可以把它放到佣金任务上。