如何在 Ruby On Rails 上使用没有模型的 Faker gem?

How to use Faker gem without a model in Ruby On Rails?

第一次在这里发帖。我目前在 Rails 项目上有一个 Ruby,我在其中有一个 PostgreSQL 数据库。我最近在 PostgreSQL 数据库中创建了一个 table,我想生成假数据来填充它。问题是我通常这样做的方式是使用模型,而我的 PostgreSQL 数据库中的 table 没有。我通常会这样做:

50.times do
  Model.create({ ...properties })
end

没有模型怎么办?可以用 table 这个名字吗?如果我只使用 table 名称(没有模型),我会收到此错误:NameError: uninitialized constant.

感谢任何帮助:)

aburr 完美地回答了我的问题!

我的第一个想法是,如果您没有模型或 class 与 SQL table 关联的任何类型,那么您可以执行 SQL insert 声明。

可能是这样的

require 'pg'
require 'faker'

db =  PG.connect({:dbname => 'my_db_name'})

50.times do
  db.exec("insert into Users (name) values(#{Faker::Name.name}")
end

这是 Faker 自述文件 https://github.com/faker-ruby/faker/blob/master/README.md#usage

以及将 SQL 与 Ruby http://zetcode.com/db/postgresqlruby/

一起使用的参考

我建议为 table 制作一个模型。这是微不足道的。如果您使用的是 Rails 6,则可以利用 insert_all 显着加快创建速度。

class SomeThing < ApplicationRecord
end

如果您想放弃,可以使用 exec_insert 手动执行插入。

ActiveRecord::Base.connection.exec_insert(
  'insert into some_thing (first_name, last_name) values (, )',
  nil,
  [[nil, Faker::Name.first_name], [nil, Faker::Name.last_name]]
);

最后,与其手动编写 50.times { SomeThing.create(...) },不如考虑使用 FactoryBot

factory :some_thing do
  name { Faker::Name.name }
end

FactoryBot.create_list(:some_thing, 50)

问题不在于 gem 'faker',实际上它是一个伪造的数据生成器。所以问题是关于 ActiveRecord 的,你需要找到关于 ActiveRecord.
的文档 通常,Model.create(foo: 'bar') 表示 insert into Model (foo) values('bar')
所以 ActiveRecord 有原始的 sql 操作以防你有一些更复杂的场景 ActiveRecord::Base.connection.execute(sql).
如果你有机会使用gem sequel,你会在幕后得到更多的了解。

  • 数据库(MySQL,PG)
  • 数据库连接器(mysql2,pg)
  • ORM(ActiveRecord,Sequel)

这就是您处理数据库所需的全部内容。