在关注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
不再有效?
答案 0 :(得分:2)
如http://edgeguides.rubyonrails.org/4_0_release_notes.html#general中所述,Model.all
现在返回ActiveRecord::Relation
而不是Array
。虽然Relation
支持Array
所做的许多方法(例如each
),但它不支持empty?
。 to_a
将其转换为Array
,以便空测试可以正常运行。