第一次尝试使用ActiveRecord“where”,失败了

时间:2012-12-27 19:09:14

标签: sql ruby-on-rails activerecord

在我的应用中,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

所以...它不保存到数据库吗?如果是这样,我该如何解决?

2 个答案:

答案 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关联)是什么样的?

相关问题