Как минимум, компонент question_choices.all(:select => 'id').map {|x| x.id}
можно переписать, так как ActiveRecord предоставляет метод для этого question_choice_ids
.
Вы также можете просто сделать find
вместо find_by_id
. Я знаю, что find
вызовет исключение, если ничего не найдено, но в любом случае вызовет question_choices
на nil
в вашем примере:
Question.find(question_id).question_choice_ids.include?(user_choice_id)
# or
# Rails 2 (will run 2 queries unless you use :include)
Question.find(question_id).question_choices.first(:conditions => {:id => user_choice_id})
# Rails 3 (will only run 1 query)
Question.find(question_id).question_choices.where(:id => user_choice_id).first