Ruby on Rails 中文 Wiki
Rails2_0新特性_Fixtures变得简单了

现在有众多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 之间的不同:

  • 您不必为每条记录设置 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 的关系:

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 的主键值

注释

  1. has_and_belongs_to_many? 的缩写。
本条目被以下条目链接: