现在有众多 的 fixture插件 尝试着使您的 test fixtures 变得更加简单。而大多数插件都通过不同的方式达到了目的。
它们之间最好最特别的 fixture 插件 Rathole “整合进了 rails 之中”http://dev.rubyonrails.org/changeset/8036 。让我们来总结一下它的功能,以便您来使用:
让我们为示例建立下面的 model:
1 2 |
class Company < ActiveRecord::Base; has_many :employees; end class Employee < ActiveRecord::Base; belongs_to :company end |
上面所示的是一个公司和它的员工之间简单的 一对多关系。但是当我们设置 fixtures 的时候,很多不重要的元素使得我们不得不去亲自设定处于混乱的 id。而且这样的问题由于数据量的增长变得越来越严重。
companies.yml1 2 3 4 5 |
yfactorial: id: 1 name: yFactorial, LLC created_at: <%= Time.now %> updated_at: <%= Time.now %> |
1 2 3 4 5 6 |
ryan: id: 1 name: Ryan Daigle company_id: 1 created_at: <%= Time.now %> updated_at: <%= Time.now %> |
通过 Rathole 的特性,您不必再亲自解开相互交缠引用着的 id, 也不必设置 auto-magic date 列的值。请注意当您的 fixture 成熟后会变成什么:
companies.yml1 2 |
yfactorial:
name: yFactorial, LLC |
1 2 3 |
ryan: name: Ryan Daigle company: yfactorial |
- 您不必为每条记录设置 id。这个进程被自动化以后会为记录形成一组hash数组 (于是由 “yFactorial” 形成的integer hash将被作为记录的 id)
- 不必再设置 auto-magic 日期的值了。一切 created_xx 和 updated_xx 区域将自动由 Time.now 填补。
- 当引用其他记录的id时(即 employees.company_id),您只需要输入 fixture 名称,系统会使用“浓缩”后的数据作为id。这个方法使得我能够将 company_id: employees.yml 中的一行数据更改为 yfactorial。
记录:由于每一条记录的主键都经过了计算(形成 fixture 名称的数组),fixture不需要提前知道其主键值以被读取。如此便消除了很多递归式的附属关系,以及可能容易形成的数据排列问题。
然而,在您通过 join table 来管理复杂的 has_and_belongs_to_many 的关系网时,外键值 (Foreign key)的联系也得到了特别的优化。那么我们假设一个 company 与 industry_associations 之间存在 has_and_belongs_to_many 的关系:
1 2 3 4 5 6 7 8 |
class Company < ActiveRecord::Base has_and_belongs_to_many :industry_associations, :join_table => 'company_industry_associations' end class IndustryAssociation < ActiveRecord::Base has_and_belongs_to_many :companies, :join_table => 'company_industry_associations' end |
现在我们不必再撰写我们自己的 company_industry_associations.yml fixture 文件,而是直接在 companies.yml 文件中指明所属 industry_associations 的外键:
companies.yml1 2 3 |
yfactorial:
name: yFactorial, LLC
industry_associations: ruby, webservices |
假设我们拥有一个记录了 ruby 和 webservices 的 industry_associations.yml fixture 文件,系统将自动为您建立 habtm1 的 join table。
这对你们 fixture 用户们(当然我也是其中之一)来说真是天大的好处。也许还没尝试过 fixture 的朋友们再来看看?真得是非常强大的功能 – 感谢 John 为此所做的贡献!
请看看底部关于插件的README 文档,上面详细介绍了如何设定默认值,以及如何获取其他 fixture 的主键值
注释
1 即 has_and_belongs_to_many 的缩写。



