Подсчет записей активного объекта записи в Rails

Мой вопрос очень прямой и простой. Я использую Rails 3.2.13 и Ruby 2.0.0 для разработки веб-приложения. У меня есть запрос в моем 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>

Может ли кто-нибудь помочь мне выяснить, почему это происходит или как мы можем найти общее количество или записи из объекта активной записи, а не через массив?

Спасибо :)-


person Rajesh Omanakuttan    schedule 30.11.2013    source источник


Ответы (4)


find_by возвращает единственный результирующий объект (или, если запрос возвращает более одной строки, первый объект результата), а не массив, содержащий результат.

При использовании Rails 3.X вы можете использовать find_all_by, например. find_all_by_parent_id_and_question_type_id, чтобы получить ожидаемый массив.

find_all_by по-прежнему будет работать в Rails 4.0, но считается устаревшим. Использование where предпочтительнее в обеих версиях Rails. Для вашего конкретного примера мне нравится следующий формат:

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

Подробности см. на странице https://github.com/rails/activerecord-deprecated_finders.

person Steve Wilhelm    schedule 30.11.2013
comment
Вы должны использовать where и в Rails 3. - person maček; 30.11.2013

Если вы используете .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 
person maček    schedule 30.11.2013

Метод Rajesh ruby ​​.count или .length может применяться только к массиву или хэшу. Вы не можете использовать этот метод для любого объекта ActiveRecord.

Здесь во втором запросе вы получаете результат 1 объекта, поэтому в этом случае вы не можете использовать .count или .length

person Jeet    schedule 30.11.2013

Стив Вильгельм прав. У нас есть несколько способов сделать это,

@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

Спасибо вам всем.

person Rajesh Omanakuttan    schedule 30.11.2013