2013-04-17 3 views
1

У меня есть некоторый код запах здесь:Средние несколько атрибутов из ассоциированной модели

f.series(:name=>'Average review', :data=> [ 
      Integer(@review.style.reviews.average(:answer01).to_f*20), 
      Integer(@review.style.reviews.average(:answer02).to_f*20), 
      Integer(@review.style.reviews.average(:answer03).to_f*20), 
      Integer(@review.style.reviews.average(:answer04).to_f*20), 
      Integer(@review.style.reviews.average(:answer05).to_f*20), 
      Integer(@review.style.reviews.average(:answer06).to_f*20), 
      Integer(@review.style.reviews.average(:answer07).to_f*20), 
      Integer(@review.style.reviews.average(:answer08).to_f*20), 
      Integer(@review.style.reviews.average(:answer09).to_f*20), 
      Integer(@review.style.reviews.average(:answer10).to_f*20), 
      ] 

Может кто-нибудь посоветовать на лучший способ справиться с этим в одном запросе DB?

+0

Не ответ на ваш вопрос, ошибка ': data => (0..10) .map {| i | Integer (@ review.style.reviews.send (: average,: "answer # {i.to_s.rjust (2, '0')}". To_f * 20)} 'позволяет вам меньше повторений :) – pierallard

ответ

0

Хорошо, ну это не сжат, но:

@s_avgs=Style.joins(:reviews).select(
    'avg(answer01) AS avg1, 
     avg(answer02) AS avg2, 
     avg(answer03) AS avg3, 
     avg(answer04) AS avg4, 
     avg(answer05) AS avg5, 
     avg(answer06) AS avg6, 
     avg(answer07) AS avg7, 
     avg(answer08) AS avg8, 
     avg(answer09) AS avg9, 
     avg(answer10) AS avg10' 
    ).where(:id=>@review.style.id).first 

...

f.series(:name=>'Average review for this style', :data=> [ 
     Integer(@s_avgs.avg1.to_f*20), 
     Integer(@s_avgs.avg2.to_f*20), 
     Integer(@s_avgs.avg3.to_f*20), 
     Integer(@s_avgs.avg4.to_f*20), 
     Integer(@s_avgs.avg5.to_f*20), 
     Integer(@s_avgs.avg6.to_f*20), 
     Integer(@s_avgs.avg7.to_f*20), 
     Integer(@s_avgs.avg8.to_f*20), 
     Integer(@s_avgs.avg9.to_f*20), 
     Integer(@s_avgs.avg10.to_f*20), 
     ]) 

Если кто-то есть лучший вариант, дайте мне знать!

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