1

呼び出すビューがschool.html.erbあり、そのビューには、その学校の平均評価を計算する Ruby コードがあります。

このような:

<span class="label label-info">
 <%= @school.reviews.average(:rating).round(1) unless @school.reviews.blank? %>
</span>

これをモデル、ヘルパー、またはコントローラーに配置する必要がある場合は、これを別の場所に移動するのが好きです。そして、それを行うと、どうすればビューから呼び出すことができますか。

次のモデルがあります: UserReviewおよびSchool

4

4 に答える 4

2

モデルに属する平均の計算:

class School < ActiveRecord::Base

  ...

  def average_review_rating
    return nil if reviews.blank?
    reviews.average(:rating)
  end

end

書式設定であるため、平均の丸めはビューに属します。モデルに計算を配置し、ビュー (またはヘルパー) に書式を設定します。

<%= @school.average_review_rating.round(1) if @school.average_review_rating %>

これは、andand gem を使用して大幅に短縮できます。

<%= @school.average_review_rating.andand.round(1) %>

丸めをヘルパーにプッシュして、個別にテストできるようにすることもできます。

class SchoolHelper

  def format_rating(n)
    n.andand.round(1)
  end

end

これは次のように使用されます:

<%= format_rating(@school.average_review_rating) %>
于 2012-12-25T14:22:07.387 に答える
0

データを操作しているため、モデルで最もうまく機能すると思います。この種のモデルは、「ファット モデル、スキニー コントローラ」の原則に従います。

別の合理的なオプションは、 Draperのようなライブラリを使用するデコレータまたはプレゼンターです。

于 2012-12-25T14:38:50.890 に答える
0

メソッドとしてモデルに入れるのはとても理にかなっていると思います。

class School
  def avg_rating
    reviews.average(:rating).round(1) unless reviews.blank?
  end
end

なぜ理にかなっているのですか?学校の評価は、おそらく他の多くの場所でアクセスする必要があるものです: 他のビュー、他のモデルなどですSchoolschool.avg_rating「学校、あなたの評価は?」

ビューが機能しないのはなぜですか?他のビューでアクセスしたい場合があります。そのためのヘルパーがいますよね?しかし、なぜヘルパーはそうしないのでしょうか? 他のモデルからアクセスすることもできます。ヘルパーはデータを計算するためのものではなく、データをフォーマットしたり、他の同様のことを行うためのものです。

于 2012-12-25T14:14:36.057 に答える
0

モデルに入れます (学校):

def reviews_average
  reviews.average(:rating).round(1) unless reviews.blank?
end

意見:

<%= @school.reviews_average %>

理由:レンダリング速度が依存するため、DB を集中的に使用するプロシージャをビューに配置しないでください。

于 2012-12-25T14:18:02.983 に答える