计算Rails中活动记录对象的记录数

时间:2013-11-30 08:44:57

标签: ruby-on-rails ruby-on-rails-3 activerecord count ruby-2.0

我的问题非常简单明了。我正在使用Rails 3.2.13和Ruby 2.0.0来开发Web应用程序。我在questions_controller中有一个查询,

@questions = Question.where("parent_id =? and question_type_id = ?",57,12)生成以下结果。

[#<Question id: 58, description: "Explian Pointers", question_type_id: 12, parent_id: 57, created_at: "2013-11-21 06:38:58", updated_at: "2013-11-21 06:38:58">]

然后,如果我使用 @ questions.count ,那很好,我得到 1 作为计数,因为我发现这也是一个数组对象。

但是,对于@questions = Question.find_by_parent_id_and_question_type_id(57,12),它会返回

#<Question id: 58, description: "Explian Pointers", question_type_id: 12, parent_id: 57, created_at: "2013-11-21 06:38:58", updated_at: "2013-11-21 06:38:58">

当我执行 @ questions.count @ questions.length 时,会返回错误

undefined method `length' for #<Question:0x00000006496b90>

OR

undefined method `count' for #<Question:0x00000006496b90>

任何人都可以帮我找出发生这种情况的原因,或者我们如何从活动记录对象中找到总计数或记录而不是通过数组?

谢谢:) -

4 个答案:

答案 0 :(得分:2)

find_by返回单个结果对象(或者如果查询返回多行,结果的第一个对象),而不是包含结果的Array。

使用Rails 3.X时,您可以使用find_all_by,例如find_all_by_parent_id_and_question_type_id以获取您期望的数组。

find_all_by仍然可以在Rails 4.0中使用,但不推荐使用。在两个版本的Rails中首选使用where。对于您的具体示例,我喜欢以下格式:

Question.where(:parent_id => exam_Question.id).where(:question_type_id => 12).count

有关详细信息,请参阅https://github.com/rails/activerecord-deprecated_finders

答案 1 :(得分:1)

如果您使用.where.count,您将获得正确的查询,而不是计算返回数组的大小

Question.where(parent_id: 57, question_type_id: 12).count

# => SELECT COUNT(*) FROM "questions" WHERE "questions"."parent_id" = 57 AND "questions"."question_type_id" = 12 

答案 2 :(得分:0)

Rajesh ruby​​的.count或.length方法只能应用于Array或Hash。您不能在任何ActiveRecord对象上使用该方法

在你的第二个查询中,你得到的是1个对象的结果,所以在这种情况下你不能使用.count或.length

答案 3 :(得分:0)

史蒂夫威廉是对的。我们有几种方法可以做到,

@questions = Question.find_all_by_parent_id_and_question_type_id(57,12)
@count = @questions.count => 1

OR

@questions = Question.where("parent_id =? and question_type_id = ?",exam_Question.id,12)
@count = @questions.count => 1

或者直接使用计数,

@questions = Question.count(:conditions => {:parent_id => exam_Question.id, :question_type_id => 12})
@questions => 1

谢谢大家。