第一次尝试使用活动记录"where"失败



在我的应用程序中,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关联)是什么样子的?

相关内容

  • 没有找到相关文章

最新更新