2015-04-15 67 views
0

我正在閱讀Rails 4 Test Prescriptions。我對'Sum'方法有一個有趣的觀察。從書中有兩個模型:項目和任務Rails活動記錄對象。 「總和」的表現令人驚訝

class Project < ActiveRecord::Base 

    has_many :tasks 
    ... 
end 

class Task < ActiveRecord::Base 
    belongs_to :project 
    ... 
end 

#Rspec code 
describe "estimates" do 
    let(:project) { Project.new } 
    let(:newly_done) { Task.new(size: 3, completed_at: 1.day.ago)} 
    let(:old_done) { Task.new(size: 2, completed_at: 6.months.ago)} 
    let(:small_not_done) { Task.new(size: 1)} 
    let(:large_not_done) { Task.new(size: 4)} 

    before(:each) do 
    project.tasks = [newly_done, old_done, small_not_done, large_not_done] 
    othertasks = [newly_done, old_done,small_not_done, large_not_done] 

    puts "Size of project is #{project.tasks.sum(&:size)}" # line 1 <- 0 
    puts "Size of othertasks is #{othertasks.sum(&:size)}" # line 2 <- 10 
    end 
end 

如註釋所示,第1行打印0和第2行打印10(預期結果)。我也試過用讓!代替讓和得到相同的結果。 我想知道這種不一致行爲的原因是什麼。我使用的紅寶石2.2和Rails 4.2.1

編輯: 我曾嘗試: 1.保存項目任務是使用創建的,而不是新的

添加

... 
    project.tasks << [newly_done, old_done, small_not_done, large_not_done] 
    project.save 
    ... 

和2後

 ... 
     let(:project) { Project.create } 
     let(:newly_done) { Task.create(size: 3, completed_at: 1.day.ago)} 
     let(:old_done) { Task.create(size: 2, completed_at: 6.months.ago)} 
     let(:small_not_done) { Task.create(size: 1)} 
     let(:large_not_done) { Task.create(size: 4)} 
     ... 

仍然得到了相同的結果。

回答

0

原來我需要在執行聚合操作之前添加to_a。 工作的代碼是:

#Rspec code 
    describe "estimates" do 
    let(:project) { Project.new } 
    let(:newly_done) { Task.new(size: 3, completed_at: 1.day.ago)} 
    let(:old_done) { Task.new(size: 2, completed_at: 6.months.ago)} 
    let(:small_not_done) { Task.new(size: 1)} 
    let(:large_not_done) { Task.new(size: 4)} 

    before(:each) do 
     project.tasks = [newly_done, old_done, small_not_done, large_not_done] 
     othertasks = [newly_done, old_done,small_not_done, large_not_done] 

     puts "Size of project is #{project.tasks.to_a.sum(&:size)}" # line 1 <- 10 
     puts "Size of othertasks is #{othertasks.sum(&:size)}" # line 2 <- 10 
    end 
    end 

通知的to_a在第1行