2012-12-25 1 views
1

나는 school.html.erb이라고 부르는 견해를 가지고 있으며 그 견해에서 나는 그 학교의 평균 등급을 계산하는 루비 코드를 가지고있다. 이처럼어디서 모델, 도우미 또는 컨트롤러에이 코드를 넣어야합니까?

: 내가 다른이 곳을 이동하고자

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

, 나는 모델, 도우미 또는 컨트롤러에 넣고해야한다. 그리고 제가 그렇게한다면 어떻게 그 견해에서 그것을 부를 수 있습니다.

다음 모델을 가지고 있습니다 : User, ReviewSchool.

답변

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 보석을 사용하면 상당히 짧아 질 수 있습니다.

<%= @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) %> 
1

나는 방법으로 모델에 넣는 것이 합리적이라고 생각합니다.

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

왜 의미가 있습니까? 음, 학교 등급은 많은 다른 장소에서 액세스해야 할 가능성이 높습니다 : 다른보기, 다른 모델 등. 메소드에 넣으면 속성이 School 인 것처럼 보일 수 있습니다. school.avg_rating은 그 자체로 꽤 많이 말합니다 : "학교, 당신의 평가는 무엇입니까?"

왜보기가 안되나요? 다른보기에서 액세스 할 수 있습니다. 거기에는 도우미가 있습니다. 맞죠? 그러나 왜 도우미는하지 않을 것인가? 다른 모델에서도 액세스 할 수 있습니다. 헬퍼는 데이터를 계산하는 것이 아니라 형식을 지정하고 다른 유사한 작업을 수행하기위한 것입니다. 모델 (학교)에 넣어

0

:

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

보기 :

<%= @school.reviews_average %> 

이유 : 렌더링 속도가에 의존하기 때문에 뷰에 DB를 집중적 절차를 넣지 마십시오.

+0

쿼리를 모델로 옮기는 것이 성능상의 이점입니까? 어느 쪽이든 같은 시간이 걸릴 것 같습니다. –

+0

나는 너무 생각했다. 그것을 증명하기 위해보기 안에서 무언가를 실행하고 시간 응답을 보라. 가장 큰 차이는 눈에 띄지 않지만, 그렇습니다. –

0

내가 그것을 작동 말할 것 모델에서 가장 효과적입니다. 데이터로 작업하기 때문입니다. 이 종류는 다음과 같습니다. the "fat model, skinny controller" principle.

Draper과 같은 라이브러리를 사용하는 다른 합리적인 옵션은 데코레이터 또는 발표자입니다.

관련 문제