迁移Rails 3.2→4.0后,dup方法无法正常工作

时间:2013-07-23 15:09:43

标签: ruby-on-rails rspec capybara railstutorial.org dup

在关注Rails 4.0 supplement之后,我进入了Some specific issues部分,迈克尔提到了

  

Micropost规范中的一个微小变化(spec/models/micropost_spec.rb)是从dup方法(复制用户的用户微博)到to_a方法(将其转换为数组)。以下是dup的版本:

Rails 3.2

it "should destroy associated microposts" do
  microposts = @user.microposts.dup
  @user.destroy
  microposts.should_not be_empty
  microposts.each do |micropost|
    Micropost.find_by_id(micropost.id).should be_nil
  end
end

Rails 4.0

it "should destroy associated microposts" do
  microposts = @user.microposts.to_a
  @user.destroy
  expect(microposts).not_to be_empty
  microposts.each do |micropost|
    expect(Micropost.where(id: micropost.id)).to be_empty
  end
end

他自己说他并不完全理解改变方法的必要性:

  

由于我不明白的原因,对dup的调用不再适用于Rails   4.0,但用to_a替换它可以正常工作。

那么为什么dup不再有效?

1 个答案:

答案 0 :(得分:2)

http://edgeguides.rubyonrails.org/4_0_release_notes.html#general中所述,Model.all现在返回ActiveRecord::Relation而不是Array。虽然Relation支持Array所做的许多方法(例如each),但它不支持empty?to_a将其转换为Array,以便空测试可以正常运行。