关联 FixtureSet 中 Rails Test Fixture 的访问属性

Access Attribute of Rails Test Fixture in Associated FixtureSet

背景

我的应用程序定义了 Employee 和 Company 模型之间的一对多关系。我使用 Company fixture 的标签 (37_signals) 为 Employee fixture 分配了一个公司。但是,我还需要分配由 SecureRandom.uuid.

生成的 company_uuid

例子

app/models/

employee.rb

class Employee
  belongs_to :company
end

company.rb

class Company
  has_many :employees
end

test/fixtures/

employees.yml

employee:
  name: dhh
  company: 37_signals 
  company_uuid: <%= "Access the 37_signals company fixture's uuid here!" %>

companies.yml

37_signals:
  name: $LABEL
  company_uuid: <%= SecureRandom.uuid %>

问题

如何访问另一个 FixtureSet 中的 Fixture 的属性?


已尝试

我尝试使用以下几行作为解决方案:

company_uuid: <%= ActiveRecord::FixtureSet.identify(:37_signals).company_uuid %>

上面找到公司的主键id值,然后调用company_uuid方法,对于整型是未定义的。这是无效的。

company_uuid: <%= companies(:37_signals).company_uuid %>

以上发现报告undefined method 'companies' for main:Object

有没有常规的方法解决这个问题?

这是我能想到的最佳解决方案:

company_uuid: <%= Company.find(ActiveRecord::FixtureSet.identify(:publish_and_export_album)).company_uuid %>

不过,这个解决方案似乎并不常规此外,我相信这会成功,因为灯具是按字母顺序加载的。如果 Company 被命名为 Organization,在 Employee 之后加载,那么我认为这不会按预期工作。 实际上,通过反复试验我确定此方法适用于相反的方向,所以 alpha 顺序没有不利影响。

如果您使用 the fixture_builder gem,这不是问题。它允许您构建模型对象的图表并为它们指定夹具名称,并为您将它们保存到 .yml 夹具文件中。

嗯,第一个选项应该是干掉数据,所以它只存在于一个地方。您可以使用 delegate 来做到这一点,这样 employee.company_uuid 将始终由 employee.company.company_uuid 回答。

如果您在 Employee 模型中确实需要它,下一个最佳选择是使用回调(例如 before_validateafter_save,具体取决于您的用例),它会复制值从公司到员工对象。您希望消除数据值偏离其真实来源的可能性。

最后,您可以将所有 UUID 提取到创建时两个设备都可以访问的散列中,并将两个值设置为: company_uuid: <%= UUIDs['37_signals'] %> ...或类似