Ruby on rails Rails:有没有办法重构这个ActiveRecord代码?

Ruby on rails Rails:有没有办法重构这个ActiveRecord代码?,ruby-on-rails,ruby,activerecord,refactoring,Ruby On Rails,Ruby,Activerecord,Refactoring,我有一段代码,用于检查用户对调查问题选择的调查响应是否是有效的选择之一: Question.find_by_id(question_id).question_choices.all(:select => 'id').map {|x| x.id}.include?(user_choice_id) 有没有更简单的方法? 谢谢 至少可以重写question\u choices.all(:select=>'id').map{x | x.id}组件,因为ActiveRecord为此question

我有一段代码,用于检查用户对调查问题选择的调查响应是否是有效的选择之一:

Question.find_by_id(question_id).question_choices.all(:select => 'id').map {|x| x.id}.include?(user_choice_id)
有没有更简单的方法?
谢谢

至少可以重写
question\u choices.all(:select=>'id').map{x | x.id}
组件,因为ActiveRecord为此
question\u choice\u id
提供了一种方法

您也可以只执行
find
而不是
find\u by\u id
。我知道
find
如果什么也找不到会引发异常,但是在您的示例中,调用
question\u choices
on
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

至少可以重写
question\u choices.all(:select=>'id').map{code>组件,因为ActiveRecord为该
question\u choice\u id
提供了一种方法

您也可以只执行
find
而不是
find\u by\u id
。我知道
find
如果什么也找不到会引发异常,但是在您的示例中,调用
question\u choices
on
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

谢谢你富有洞察力的答复。你对我的问题理解正确。但是,我认为最后两个代码片段(使用条件和命名的_范围)将无法工作。因为输入的唯一参数是选项id。这将查找此选项有效的问题,但不会检查给定选项是否对给定问题有效。缺少额外的条件CONSTRAINT::conditions=>{{{:id=>question_id},{:question_choices=>{:id=>answer}啊,你是对的,它也需要
问题id
。我没有编写测试应用程序来测试它们,但至少你得到了要点。我正在用另一种方法更新我的示例,这非常感谢你富有洞察力的回答。你正确理解我的问题。但是我不认为最后两个代码片段(使用条件和命名的_作用域)将起作用。因为输入的唯一参数是选项_id。这将查找此选项有效的问题,但不会检查给定选项是否对给定问题有效。缺少额外条件CONSTRAINT::CONSTRAINTS=>{{{:id=>question_id},{:question_choices=>{:id=>answer}啊,你是对的,它也需要
问题id
。我没有编写测试应用程序来测试它们,但至少你得到了要点。我正在用另一种更好的方法更新我的示例