在我的应用程序中,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
所以…它不保存到数据库中吗?如果是这样,我应该如何解决这个问题?
我怀疑claim()
没有将"声明的"idea
状态保存到数据库。您需要改变这种行为(如果这是您真正需要的),或者对ideas
Enumerable本身进行搜索,而不是通过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
您的代码将不会保存状态,因为在更改status
属性后没有调用任何方法来保存idea
对象。您可以通过颠倒调用的顺序来解决这个问题:
if idea.status == "available" && claimed_count < 3
idea.status = "claimed"
self.ideas<<idea
end
<<
'shovel'操作符将保存这个想法,因为您正在将其添加到持久化对象的关联集合中。
您的数据在每次测试结束时被删除-一旦测试结束,插入的数据将被回滚;它不应该在测试之间持久化!
你如何以及在哪里使用你的where
,你的模型(特别是ideas
关联)是什么样子的?