在我的应用中,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.我的查询语法显然是错误的,但我一直在研究this guide,我仍然无法理解它!
必须是非常基本的东西......任何人?
编辑:我使用以下测试获得了这些想法:
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
所以...它不保存到数据库吗?如果是这样,我该如何解决?
答案 0 :(得分:3)
我怀疑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
<强>更新强>
您的代码不会保存状态,因为在更改idea
属性后没有调用任何内容来保存status
对象。您可以通过撤消呼叫顺序来解决此问题:
if idea.status == "available" && claimed_count < 3
idea.status = "claimed"
self.ideas<<idea
end
<<
'铲子'操作符将保存该想法,因为您将其添加到持久对象的关联集合中。
答案 1 :(得分:0)
您的数据在每次测试结束时被拆除 - 一旦测试结束,插入的数据将被回滚;它不应该在测试之间持续存在!
您使用where
的方式和位置,以及您的模型(特别是ideas
关联)是什么样的?