'array.map'是否保留原始顺序?

时间:2017-10-24 02:00:44

标签: ruby-on-rails ruby

我有一个Userhas_many Job。我使用以下代码映射作业:

def ranges
  user.jobs.map { |u| [u.start_at, u.end_at] }
end

我有一个比较两个数组的规范:

my_array = [[start1, end1], [start2, end2]]
expect(ranges).to eq my_array

它传递给本地,但不传递给Bamboo版本。我不得不改变它以通过构建。我仍然不明白为什么它会像这样。即使地图不保留订单,我也期待一些随机模式。

为什么这会传递给我的本地,但在Bamboo版本中失败?

1 个答案:

答案 0 :(得分:6)

潜在问题不是因为map,而是应该保留订单。相反,user.jobs本身可能处于不同的顺序(在每个测试中),因为没有使用任何明确的order by子句。如果没有明确的order by,即使按特定顺序创建作业,也无法保证作业的顺序。

您应该使用http://www.rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers:match_array代替eq进行比较,以避免此类问题。