在夹具中的erb部分内部评估$ LABEL

时间:2017-07-10 09:13:16

标签: ruby-on-rails yaml fixtures

寻找干燥装置的方法。 我们假设我们有一些data.yml。那里有一个部分,可以从$ LABEL中引用。这是一个exapmle:

DEFAULTS: &DEFAULTS
  state: $LABEL
  score: 99
one:
  <<: *DEFAULTS
  uuid: <%= ActiveRecord::FixtureSet.identify(:one, :uuid) %>
two:
  <<: *DEFAULTS
  uuid: <%= ActiveRecord::FixtureSet.identify(:two, :uuid) %>

有没有办法干它。我想要这样的东西:

DEFAULTS: &DEFAULTS
  state: $LABEL
  score: 99
  uuid: <%= ActiveRecord::FixtureSet.identify($LABEL, :uuid) %>
one:
  <<: *DEFAULTS
two:
  <<: *DEFAULTS

但这不可能,因为这里没有评估$ LABEL。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我一直在为同样的问题苦苦挣扎,并且真的不想只为少数情况下切换到工厂,这会有所帮助。

话虽如此,看起来uuid不是你的主键,是这样吗?如果你能够将uuids作为主键(我们现在在Postgres中执行此操作),那么实际上不需要你正在做的事情,因为Rails将正确识别id上的关联。您可以尝试在模型类本身上设置primary_key以使用uuid列,因为fixture会反思应该工作并避免需要评估$ LABEL并将其干掉。

答案 1 :(得分:0)

抱歉,在替换$LABEL之前处理ERB标记。

您可以在ActiveRecord中看到字符串替换:

https://github.com/rails/rails/blob/d514ce9199fac58e569482dc901e53d0526abdf7/activerecord/lib/active_record/fixtures.rb#L656

在我的情况下,我在主键创建下面的第663行快速编写了另一个方法,这意味着我可以在我的YAML文件而不是$PRIMARY_KEY中使用$LABEL

# interpolate the primary key
row.each do |key, value|
  row[key] = value.gsub("$PRIMARY_KEY", row[primary_key_name].to_s) if value.is_a?(String)
end

显然不是一个长期的解决方案,而是留在这里以防有人发现它有用。