我的问题非常简单明了。我正在使用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>
任何人都可以帮我找出发生这种情况的原因,或者我们如何从活动记录对象中找到总计数或记录而不是通过数组?
谢谢:) -
答案 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
谢谢大家。