gpt4 book ai didi

ruby-on-rails - 关于 Rails fixtures 创建顺序的问题

转载 作者:数据小太阳 更新时间:2023-10-29 08:19:13 25 4
gpt4 key购买 nike

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

故事.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

投票.rb

class Vote < ActiveRecord::Base
belongs_to :story
end

并给定这个固定装置

故事.yml

one:
name: MyString
link: MyString

two:
name: MyString2
link: MyString2

投票.yml

one:
story: one

two:
story: one

这些测试失败了:

故事测试.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

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

故事测试.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

我照原样复制了书中的所有内容,但没有看到关于此的勘误表。我的第一个结论是夹具正在按照声明的方式从下到上创建记录,但这没有任何意义

有什么想法吗?

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

最佳答案

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

Rails 这样做是为了让您可以轻松地通过名称引用其他固定装置。例如,固定装置

#parents.yml
vladimir:
name: Vladimir Ilyich Lenin

#children.yml
joseph:
name: Joseph Vissarionovich Stalin
parent: vladimir

实际上像这样出现在你的数据库中

#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') %>

请特别注意 parent: vladimir 的扩展至 parent_id: <%= ... %>在子模型中 - 这就是 Rails 处理固定装置之间关系的方式。

这个故事的寓意:不要指望你的固定装置有任何特定的顺序,也不要指望 :order => :id在测试中给你有意义的结果。使用 results.member? objX重复而不是results == [obj1, obj2, ...] .如果您需要固定 ID,请自己将其硬编码。

希望这对您有所帮助!

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

关于ruby-on-rails - 关于 Rails fixtures 创建顺序的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4950667/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com