如何在我的Rails视图模板中摆脱这个讨厌的查询?

时间:2011-09-28 15:46:59

标签: ruby-on-rails forms model-view-controller associations

呸。它让我失望。

在我的控制器中:

@assessor = Assessor.find(params[:id])
@assessor.answers.build if @assessor.answers.empty?

在我看来:

= simple_form_for @assessor do |f|
    - @assessor.candidates.each do |candidate|
        - @assessor.assessment_competencies.each do |competency|                    

            - if @assessor.answers.all?{|a| a.new_record?}
                - competency.behaviors.each do |behavior|
                    = f.fields_for :answers do |f|
                        - @assessor.standard_answer_choices.each do |choice|
                            = f.input :assessor_id, :as => :hidden, :input_html => {:value => @assessor.id}
                            = f.input :candidate_id, :as => :hidden, :input_html => {:value => candidate.id}
                            = f.input :behavior_id, :as => :hidden, :input_html => {:value => behavior.id}
                            = f.input :competency_id, :as => :hidden, :input_html => {:value => competency.id}
                            = f.association :answer_choice, :collection => [choice], :as => :radio

            - else
                - competency.behaviors.each do |behavior|
                    - answer = Answer.find_or_create_by_behavior_id_and_assessor_id_and_candidate_id(behavior.id, @assessor.id, candidate.id)
                    = f.fields_for :answers, answer do |f|
                        = f.input :assessor_id, :as => :hidden, :input_html => {:value => @assessor.id}
                        = f.input :candidate_id, :as => :hidden, :input_html => {:value => candidate.id}
                        = f.input :behavior_id, :as => :hidden, :input_html => {:value => behavior.id}
                        = f.input :competency_id, :as => :hidden, :input_html => {:value => competency.id}
                        = f.association :answer_choice, :collection => [choice], :as => :radio

1 个答案:

答案 0 :(得分:1)

Oof,这是一个多得多的人。

至少你可以将重复的fields_for阻挡成一个帮手:

module AssessorsHelper
  def answers_fields f, candidate, behavior, competency, answer=nil
    assessor = f.object

    f.fields_for :answers, answer do |f|
      f.hidden_field :assessor_id,    :value => assessor.id
      f.hidden_field :candidate_id,   :value => candidate.id
      f.hidden_field :behavior_id,    :value => behavior.id
      f.hidden_field :competency_id,  :value => competency.id
      f.association :answer_choice, :collection => [choice], :as => :radio
    end
  end
end

那会把你的观点降低到这个:

= simple_form_for @assessor do |f|
  - @assessor.candidates.each do |candidate|
    - @assessor.assessment_competencies.each do |competency|                    

      - if @assessor.answers.all?{|a| a.new_record?}
        - competency.behaviors.each do |behavior|
          = answers_fields f, candidate, behavior, competency

      - else
        - competency.behaviors.each do |behavior|
          - answer = @assessor.answers.find_or_create_by_behavior_id_and_candidate_id behavior, candidate

          = answers_fields f, candidate, behavior, competency, answer

如果你想要你可以将它分解为每个内循环的助手,但你明白了。