2016-04-16 7 views
0

私のアプリには2つのモデルがあります。PersonとReviewそれぞれに多くのレビューがあり、それぞれのレビューは個人に属します。私は属性が私のレビューモデルの内側にgradeと呼ばれ、私はこのスコープを書いたので、私は一人一人の平均等級を表示したいと思います:スコープからbelongs_toモデルからプロパティにアクセスする方法

scope :average_grade, -> { self.first.review.average(:grade) } 

はそれを行うためのより良い方法はありますか? 2つのクエリに加えて、この方法が必要であることを、私も自分のコントローラに適切なPersonオブジェクトを取得するには、別の2つのクエリを実行する必要があります。

def show 
    @average = Person.includes(:review).where(id: params[:id]).average_grade 
    @person = Person.includes(:review).find(params[:id]) 
end 

がどのように私はこれらのクエリのすべてを避けることができますか?

答えて

2

スコープは、ActiveRecord :: Relationオブジェクトを返さないため、スコープではなくインスタンスメソッドです。私はあなたが次の操作を行うことをお勧め

のプレゼンターに
# person.rb: 
def average_grade 
    review.average(:grade) 
end 

# controller: 
def show 
    @person = Person.find(params[:id]) 
    @average = @person.average_grade 
end 
+0

を見つけることができるありがとうございました方法は、自己を必要としない理由ところで!? – Bezzi

+1

インスタンスがインスタンスを呼び出す場合、 'self'内部インスタンスメソッドを省略することができます。 – Ilya

1
# person.rb 
class Person < ActiveRecord::Base 
    has_many :reviews 
end 

# review.rb 
class Review < ActiveRecord::Base 
    belongs_to :person 

    scope :by_person, ->(person) { where(person_id: person) } 
end 

# persons_controller 
class PersonsController < ApplicationController 
    helper_method :person 

private 

    def person 
    return @person if defined? @person 

    @person = Person.find(params[:id]) 
    end 
end 

# show.html.haml 
- present(person) do |person_presenter| 
    %p= person_presenter.average_grade 

# person_presenter.rb 
class PersonPresenter < BasePresenter 
    present :person 

    def average_grade 
    Review.by_person(person).average(:grade) 
    end 
end 

より多くのあなたがここにRailscasts PRO #287 Presenters from Scratch

関連する問題