Rails灯具创建顺序问题

yre*_*uta 2 ruby rake unit-testing ruby-on-rails

我正在阅读Sitepoint的Simply Rails一书,并给出了这些模型:

story.rb

class Story < ActiveRecord::Base
    validates_presence_of :name, :link
    has_many :votes do
        def latest
            find :all, :order => 'id DESC', :limit => 3
        end
    end

    def to_param
        "#{id}-#{name.gsub(/\W/, '-').downcase}"
    end
end
Run Code Online (Sandbox Code Playgroud)

vote.rb

class Vote < ActiveRecord::Base
    belongs_to :story
end
Run Code Online (Sandbox Code Playgroud)

并给出了这个装置

stories.yml

one:
  name: MyString
  link: MyString

two:
  name: MyString2
  link: MyString2
Run Code Online (Sandbox Code Playgroud)

votes.yml

one:
  story: one

two:
  story: one
Run Code Online (Sandbox Code Playgroud)

这些测试失败:

story_test.rb

def test_should_have_a_votes_association
    assert_equal [votes(:one),votes(:two)], stories(:one).votes
  end

def test_should_return_highest_vote_id_first
    assert_equal votes(:two), stories(:one).votes.latest.first
  end
Run Code Online (Sandbox Code Playgroud)

但是,如果我颠倒了故事的顺序,对于第一个断言,并为第一个断言提供第一个投票,它通过

story_test.rb

def test_should_have_a_votes_association
    assert_equal [votes(:two),votes(:one)], stories(:one).votes
  end

  def test_should_return_highest_vote_id_first
    assert_equal votes(:one), stories(:one).votes.latest.first
  end
Run Code Online (Sandbox Code Playgroud)

我复制了书中的所有内容,并没有看到关于此的勘误.我的第一个结论是,夹具在声明时从下到上创建了记录,但这没有任何意义

有任何想法吗?

编辑:我正在使用RVM中运行的Rails 2.9

Xav*_*olt 8

您的灯具没有像您期望的那样获得ID 1,2,3等等 - 当您添加灯具时,它们会根据表名和灯具名称的散列获得ID(我认为).对我们人类而言,它们看起来就像是随机数.

Rails会这样做,因此您可以轻松地通过名称引用其他灯具.例如,灯具

#parents.yml
vladimir:
  name: Vladimir Ilyich Lenin

#children.yml
joseph:
  name: Joseph Vissarionovich Stalin
  parent: vladimir
Run Code Online (Sandbox Code Playgroud)

实际上显示在你的数据库中

#parents.yml
vladimir:
  id: <%= fixture_hash('parents', 'vladimir') %>
  name: Vladimir Ilyich Lenin

#children.yml
joseph:
  id: <%= fixture_hash('children', 'joseph') %>
  name: Joseph Vissarionovich Stalin
  parent_id: <%= fixture_hash('parents', 'vladimir') %>
Run Code Online (Sandbox Code Playgroud)

请特别注意从扩展parent: vladimirparent_id: <%= ... %>在子模型-这是Rails的如何处理夹具之间的关系.

故事的道德:不要指望你的灯具有任何特定的顺序,并且不要指望:order => :id在测试中给你有意义的结果.results.member? objX反复使用而不是results == [obj1, obj2, ...].如果您需要固定ID,请自行硬编码.

希望这可以帮助!

PS:列宁和斯大林实际上没有关系.