0

在我的应用程序中,puts self.ideas.inspect输出:

[#<Idea id: 1, title: "Ad et ut nesciunt ut.", 
note: ["Ratione et aut harum.", "Dicta nostrum sit officiis voluptates molestiae veritatis ut."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>, 
#<Idea id: 2, title: "Asperiores dolores modi et.", 
note: ["Reprehenderit harum consequuntur repellendus qui.", "Labore eum minus voluptas quidem aliquid est occaecati."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>, 
#<Idea id: 3, title: "Labore nam deserunt quibusdam.", 
note: ["Sequi saepe itaque.", "Numquam distinctio vel hic et qui."], 
status: "claimed", 
created_at: "2012-12-27 19:03:11", updated_at: "2012-12-27 19:03:11", user_id: 1>]

然而在下一行,claimed_count = self.ideas.where(status: "claimed").size返回 0。我的查询语法显然是错误的,但我一直在仔细研究本指南,但我仍然无法弄清楚!

必须是非常基本的东西......有人吗?

编辑:我使用以下测试获得了这些想法:

it "can't claim an idea if he already has 3 ideas with claimed status" do
  james.claim(si_title0)
  james.claim(si_title1)
  james.claim(si_title2)
  james.claim(si_title3)
  james.ideas.size.should eq 3
end

我很抱歉这个丑陋的测试......我打算在我通过后试图找出重构它的插值。上面的inspect转储来自循环的第三或第四次迭代。

编辑2:这就是claim

  def claim(idea)
    puts self.ideas.inspect
    #claimed_count = self.ideas.where(status: "claimed").count
    claimed_count = self.ideas.count(conditions: "status='claimed'")
    puts "claimed_count is #{claimed_count.inspect}"
    if idea.status == "available" && claimed_count < 3
      self.ideas<<idea
      idea.status = "claimed"
    end
  end

那么......它不会保存到数据库中吗?如果是这样,我应该如何解决这个问题?

4

2 回答 2

3

我怀疑这claim()没有将“声明”idea状态保存到数据库中。您需要更改此行为(如果这是您真正需要的),或者搜索ideasEnumerable 本身而不是通过where. 您可以select为此使用:

james.ideas.select{|idea| idea.status == "claimed"}.size

您可以添加一个辅助方法来Idea简化查询:

class Idea < ActiveRecord::Base
  def claimed?
    status == "claimed"
  end
end

james.ideas.select(&:claimed?).size

更新

您的代码不会按原样保存状态,因为idea更改属性后不会调用任何内容来保存对象status。您可以通过颠倒调用顺序来解决此问题:

if idea.status == "available" && claimed_count < 3
  idea.status = "claimed"
  self.ideas<<idea
end

'shovel' 运算符将保存这个<<想法,因为您将它添加到持久对象的关联集合中。

于 2012-12-27T19:21:05.613 回答
0

您的数据在每次测试结束时被删除——一旦测试结束,插入的数据将被回滚;它不应该在测试之间持续存在!

你如何以及在哪里使用你的where,你的模型(特别是ideas关联)是什么样的?

于 2012-12-27T19:19:07.570 回答