1

Мой вопрос очень прямолинейный и простой. Я использую Rails 3.2.13 и Ruby 2.0.0 для разработки веб-приложения. У меня есть запрос в моих вопросах_controller,Принимая количество записей активного объекта записи в Rails

@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, это нормально, и я получаю как кол, как я смог найти это массив объектов также.

Но для @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> 

ИЛИ

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

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

спасибо:) -

ответ

2

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 подробности.

+1

Вы должны использовать 'where' в Rails 3, тоже. –

+1

@macek, это правда. –

0

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

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

0

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

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

ИЛИ

@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 

Благодарю вас всех.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^