Rails中有个rake rask,叫做 db:fixtures:load,可以帮你自动load指定目录下(text/fixtures)的yml或csv文件。然而,如果这些文件之间有依赖关系,这个task会失败。
比如有两个模型Image和Locations,依赖关系为:Image has_and_belongs_to_many Locations 的单向关联。
数据库中分别对应Images和Locations表,并通过image_category_rel表关联。
在test/fixtures目录下有这两个模型的yml文件,分别为:
image1:
id: 1
locations: china
china:
name:china
如果db:fixtures:load先加载category文件,然后加载images文件,肯定没问题。不幸的是,我们使用时出现了这样的错误:
The INSERT statement conflicted with the FOREIGN key constraint ......
经过进一步测试,发现就是load时首先加载了images文件,插入中间表时无法找到对Locations表的关联。
所以解决yml文件的加载顺序就可以。上网google了一下,已经有人遇到了同样的问题,而且incognito
给了一个这样的task:
task :load_fixtures_ordered => :environment do
require 'active_record/fixtures'
ordered_fixtures = Hash.new
ENV["FIXTURE_ORDER"].split.each { |fx| ordered_fixtures[fx] = nil }
other_fixtures = Dir.glob(File.join(RAILS_ROOT, 'test', 'fixtures', '*.{yml,csv}')).collect { |file| File.basename(file, '.*') }.reject {|fx| ordered_fixtures.key? fx }
ActiveRecord::Base.establish_connection(ENV['RAILS_ENV'])
(ordered_fixtures.keys + other_fixtures).each do |fixture|
Fixtures.create_fixtures('test/fixtures', fixture)
end unless :environment == 'production'
end
觉得写的有些麻烦了,于是和小龙一块整了一个简单一点的,如下:
task :load_ordered => :environment do
require 'active_record/fixtures'
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
ordered = %w( location image )
(ordered + Dir.glob(File.join(RAILS_ROOT, 'test', 'fixtures', '*.{yml,csv}')).collect { |file| File.basename(file, '.*') }).uniq.each do |fixture_name|
Fixtures.create_fixtures('test/fixtures', fixture_name)
end unless :environment == 'production'
end
测试发现,运行正常。
这个任务主要用到了数组的+、uniq方法,觉得比incognito上面更简单一些。
分享到:
相关推荐
- `rake db:fixtures:load FIXTURES=x,y`: 加载指定的 fixtures 文件。 - **数据库结构管理**: - `rake db:structure:dump`: 导出数据库结构为 SQL 文件。 - `rake db:structure:load`: 加载 SQL 文件中的数据库...
- `rake db:fixtures:load`: 加载fixtures数据到数据库。可以通过`FIXTURES=x,y`来指定加载哪些fixtures。 - `rake db:migrate`: 执行数据库迁移。可以使用`VERSION=x`来指定执行到哪个版本。 - `rake db:schema:...
- **资产服务器支持**:为了更好地管理静态资源,如图片、CSS和JavaScript文件等,Rails 2.0增加了资产服务器的支持,使得这些资源的加载和缓存更加高效。 ##### 3.2 资产缓存 - **资产缓存**:通过将静态资源缓存...
- **测试Rake任务**:Rake任务是Ruby中执行特定操作的脚本,也需要进行测试。 #### 九、迈向测试驱动开发 - **功能规划**:在开发功能之前先规划好测试,确保每一项功能都能够被正确测试。 - **由红变绿**:采用...
了解Rails应用程序的目录结构有助于开发者更高效地组织代码和资源,并且能够快速定位问题所在。通过本文的介绍,希望能够帮助读者更好地掌握Rails开发中的基础概念和技术细节,为进一步的学习和发展奠定坚实的基础。
欧付宝金流串接示范网站 本站主旨用于教学使用,并设计最小、可行的购物车系统。 使用串接欧付宝。 使用产生后台。 欧付宝测试信用卡 信用卡测试卡号:4311-9522-...bin/rake db:setup db:fixtures:load rails server
例如,`where`方法用于过滤记录,`order`用于排序,`includes`用于预加载关联数据以避免N+1查询问题。 6. **ActiveRecord回调**: 回调是在特定数据库操作前后自动调用的方法,如`before_create`、`after_save`等...
自述文件 Ember Hacker News Clone的后端,在Ruby 4.2上使用 。 可以从获取Ember Hacker News克隆代码。 数据库创建 rake db:migrate rake db:fixtures:load RAILS_ENV=development
5. FactoryBot(以前称为Factory Girl):用于测试中的对象创建,简化了 fixtures(测试数据)的创建。 6. Capistrano:自动化部署工具,可以用来部署Rails应用到远程服务器。 总的来说,"Jaekeun-Lee.github.io...