`
aqingsao
  • 浏览: 174699 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

解决Rails rake fixtures加载的顺序问题

阅读更多

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上面更简单一些。

 

1
0
分享到:
评论

相关推荐

    java基础之rails命令大全.pdf

    - `rake db:fixtures:load FIXTURES=x,y`: 加载指定的 fixtures 文件。 - **数据库结构管理**: - `rake db:structure:dump`: 导出数据库结构为 SQL 文件。 - `rake db:structure:load`: 加载 SQL 文件中的数据库...

    ruby命令集合(一些有用的命令)

    - `rake db:fixtures:load`: 加载fixtures数据到数据库。可以通过`FIXTURES=x,y`来指定加载哪些fixtures。 - `rake db:migrate`: 执行数据库迁移。可以使用`VERSION=x`来指定执行到哪个版本。 - `rake db:schema:...

    Rails2.0资料

    - **资产服务器支持**:为了更好地管理静态资源,如图片、CSS和JavaScript文件等,Rails 2.0增加了资产服务器的支持,使得这些资源的加载和缓存更加高效。 ##### 3.2 资产缓存 - **资产缓存**:通过将静态资源缓存...

    使用RSpec 测试Rails 程序.pdf

    - **测试Rake任务**:Rake任务是Ruby中执行特定操作的脚本,也需要进行测试。 #### 九、迈向测试驱动开发 - **功能规划**:在开发功能之前先规划好测试,确保每一项功能都能够被正确测试。 - **由红变绿**:采用...

    Ruby on Rails所构建的应用程序基本目录结构总结

    了解Rails应用程序的目录结构有助于开发者更高效地组织代码和资源,并且能够快速定位问题所在。通过本文的介绍,希望能够帮助读者更好地掌握Rails开发中的基础概念和技术细节,为进一步的学习和发展奠定坚实的基础。

    brainana_shop:欧付宝+ Rails 串接范例网站

    欧付宝金流串接示范网站 本站主旨用于教学使用,并设计最小、可行的购物车系统。 使用串接欧付宝。 使用产生后台。 欧付宝测试信用卡 信用卡测试卡号:4311-9522-...bin/rake db:setup db:fixtures:load rails server

    train_system:Ruby和Rails Ruby数据库基础知识火车系统,库(两天项目)

    例如,`where`方法用于过滤记录,`order`用于排序,`includes`用于预加载关联数据以避免N+1查询问题。 6. **ActiveRecord回调**: 回调是在特定数据库操作前后自动调用的方法,如`before_create`、`after_save`等...

    ember-hacker-news-backend:Ember Hacker News Clone的后端,在4.2上使用Rails-API

    自述文件 Ember Hacker News Clone的后端,在Ruby 4.2上使用 。 可以从获取Ember Hacker News克隆代码。 数据库创建 rake db:migrate rake db:fixtures:load RAILS_ENV=development

    Jaekeun-Lee.github.io

    5. FactoryBot(以前称为Factory Girl):用于测试中的对象创建,简化了 fixtures(测试数据)的创建。 6. Capistrano:自动化部署工具,可以用来部署Rails应用到远程服务器。 总的来说,"Jaekeun-Lee.github.io...

Global site tag (gtag.js) - Google Analytics