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