在 Rails 控制台中加载和使用夹具

Posted

技术标签:

【中文标题】在 Rails 控制台中加载和使用夹具【英文标题】:Load and use fixture in rails console 【发布时间】:2011-10-26 00:37:20 【问题描述】:

我想知道是否有办法在 Rails 控制台中加载和/或使用夹具。实际上,我想从我的夹具 users.yml 创建一个用户来做一些测试,而不必经历每次做 User.new(:name = "John", :email = "..") 的所有“痛苦”。 我目前在测试环境中(rails c RAILS_ENV=test)。

如果这不是一个好的做事方式,请说出来。我是 Rails 新手,所以我来这里学习 :)

【问题讨论】:

【参考方案1】:

您应该能够在进入控制台之前加载您的灯具。像这样:

RAILS_ENV=test bin/rails db:fixtures:load
RAILS_ENV=test bin/rails console

但是,您仍然无法像在测试中那样访问您的夹具数据。这只是将您的测试数据库与您的夹具数据一起加载。所以你仍然需要做类似的事情:

user = User.find_by(name: "John")

但是,您仍然可以为此类事情创建快捷方式。您可以将任何您想要的 ruby​​ 代码添加到 ~/.irbrc。我建议按照here 的描述创建一个 .railsrc 文件。然后,您可以设置以下内容:

john = User.find_by(name: "John")

所以现在您可以在控制台加载后开始引用变量“john”。顺便说一句,我链接到的帖子显示了如何设置全局 .railsrc 文件,但您可以设置它以便每个项目都有一个 .railsrc。或者,如果您想要一些不那么花哨但容易做的事情......只需在您的项目中创建一个 ruby​​ 文件(可能是“shortcuts.rb”)。加载控制台后,只需执行 require 'shortcuts'。

【讨论】:

感谢您的回答 - 但是(至少在 Rails 3.2.5 中)命令是:rails c test 从 Rails 6.0 开始,rails c test 似乎不起作用。改为RAILS_ENV=test rails c @MasaSakano LOL...回到我原来的答案?【参考方案2】:

可能会迟到... 导轨 4

require 'active_record/fixtures'
ActiveRecord::FixtureSet.create_fixtures(Rails.root.join('test', 'fixtures'), 'users')

【讨论】:

【参考方案3】:

您也可以将夹具加载到您的开发数据库中:

$ rake db:fixtures:load
$ rails c
> require 'active_record/fixtures'
> john = User.find ActiveRecord::FixtureSet.identify('john')

【讨论】:

【参考方案4】:

所以我有类似但略有不同的需求。我想使用我现有的装置(来自我的 rspec 测试)来填充我的开发数据库。这就是我通过向我的 rake 文件(位于 libs/tasks/*.rake 中)添加一个新任务来做到这一点的方法:

task d_populate: :environment do
  require 'active_record/fixtures'
  fixtures_dir = File.join(Rails.root, '/spec/fixtures') #change '/spec/fixtures' to match your fixtures location
  Dir.glob(File.join(fixtures_dir,'*.yml')).each do |file|
  base_name = File.basename(file, '.*')
  puts "Loading #base_name..."
  ActiveRecord::Fixtures.create_fixtures(fixtures_dir, base_name)
  end
end

如果您将其与 db:reset 结合使用,您也可以通过将其添加到您的 rake 任务来随意填充您的开发环境:

task reseed: [:environment, 'db:reset', 'db:d_populate']

然后你可以调用 rake db:reseed 从fixture YAML 文件中填充。

【讨论】:

【参考方案5】:

您可以按如下方式在 Rails 3.2 控制台中加载夹具:

require 'active_record/fixtures'

ActiveRecord::Fixtures.create_fixtures FIXTURE_PATH_HERE, MODEL_NAME_HERE

【讨论】:

【参考方案6】:

可以使用 FIXTURES_DIR 变量指定备用夹具目录。该值应该与测试/夹具相关。

$ rake db:fixtures:load RAILS_ENV=test FIXTURES_DIR='../../spec/fixtures'

也可以指定一组有限的灯具

$ rake db:fixtures:load RAILS_ENV=test FIXTURES_DIR='../../spec/fixtures' FIXTURES=users,user_roles

【讨论】:

hmm ... 这对我不起作用,但这确实有效:rake db:fixtures:load RAILS_ENV=test FIXTURES_PATH='spec/fixtures' FIXTURES=users,participants 这是从 Rails 6 开始的最新方法。FIXTURES_DIR 可用于指定 test/fixtures 的子目录。 FIXTURES_PATH 可用于指定任何路径。

以上是关于在 Rails 控制台中加载和使用夹具的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Rails 控制台中加载 Ruby EventMachine - 没有要加载的文件

在android中加载和保存数据文件

我的控制器索引视图的背景图像未在 rails 4 应用程序中加载?

如何在 TPM 中加载和使用持久对称密钥?

在非 Codeigniter 类中加载和使用 Codeigniter 模型

如何使用 Pandas 在 MySQL-DB 中加载和保存部分表