如何在 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)
这就是您处理数据库所需的全部内容。
第一次在这里发帖。我目前在 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)
这就是您处理数据库所需的全部内容。