在轨道固定装置上的红宝石中自动关联

时间:2009-04-18 18:11:51

标签: ruby-on-rails ruby fixtures

this article所述,我在灯具中使用自动关联。例如,如果某个区域对象具有国家/地区ID,而不是执行“country_id”:1,则执行“country”:“USA”。 “USA”是我的countries.yml文件中的标签,因此灯具知道如何处理这个问题。但是,这仅在您没有为countries对象指定ID值时才有效。所以我不能将美国的ID指定为1.但如果我不将它指定为1,它最终会成为一些大值8974343 ...这有点奇怪。有没有办法让灯具自动生成不是超高的id? ......或者这样可以吗?

5 个答案:

答案 0 :(得分:24)

这是获取灯具标签的自动生成ID的方法。

Fixtures.identify(:reginald)

答案 1 :(得分:22)

阅读API文档,这正是自动生成的灯具应该如何表现的行为 - 如果您想提前获得灯具的特定ID值,您应该自己分配它。

如果没有,那么,来自API文档:

The generated ID for a given label is constant, so we can discover any fixture‘s ID without loading anything, as long as we know the label.

答案 2 :(得分:16)

由于我没有足够的声誉来评论,这是实际的Rails 4.1文档:

http://edgeapi.rubyonrails.org/classes/ActiveRecord/FixtureSet.html#class-ActiveRecord::FixtureSet-label-Fixture+label+interpolation

在Fixture标签插值下:

monkey_id: <%= ActiveRecord::FixtureSet.identify(:reginald) %>
pirate_id: <%= ActiveRecord::FixtureSet.identify(:george) %>

答案 3 :(得分:3)

灯具的ID直接来自散列它的名称(这就是“我们可以发现任何灯具的ID而不加载任何东西,只要我们知道标签”)

答案 4 :(得分:1)

自动化测试以强制执行夹具完整性

  class FixtureIntegrityTest < ActiveSupport::TestCase
    context "fixture integrity" do
      should "work" do
        fixtures = Dir["test/fixtures/*.yml"].map do |file|
          [file, File.basename(file).sub(/\..*/, "").singularize, YAML.load(ERB.new(File.read(file)).result)]
        end

        failures = fixtures.reject(&:last).map { |file,*| "#{file} is empty!"}

        failures = failures.presence || fixtures.map do |_, klass, content|
          content.select{ |_,fixture| fixture["id"] }.map do |name, _|
            fixtures.map do |file, _, content|
              content.select { |_,fixture| fixture[klass] == name }.map do |_, fixture|
                "#{file} uses #{klass}: #{name}, but should use the id!"
              end
            end
          end
        end.flatten.compact

        assert_equal [], failures
      end
    end
  end