2016-08-15 1 views
0

Rails(4.2.7)アクティブレコードモデルのスコープ機能に問題があります。平均スコープ付き関数は、クエリに結果があるときにリレーションを生成するのはなぜですか?

は、私は以下のスコープ機能も同一のクラスメソッドを平均ムービーのサイズを計算し、することを定義している:クエリは、いくつかのレコードを照合する場合

scope :average_size, -> { average(:file_file_size) } 

    def self.average_size_test 
    average(:file_file_size) 
    end 

、スコープとクラスメソッドは、期待どおりに動作:

しかしながら
2.2.4 :037 > Video.average_size 
=> #<BigDecimal:1d483b0,'0.1790511428 57143E6',18(36)> 
2.2.4 :038 > Video.average_size_test 
=> #<BigDecimal:4f278b8,'0.1790511428 57143E6',18(36)> 

、クエリが結果と一致していない、クラスメソッドとスコープ方法の結果は異なります

2.2.4 :040 > Video.where(language: 'ch').average_size_test 
=> nil 
2.2.4 :041 > Video.where(language: 'ch').average_size 
=> #<ActiveRecord::Relation []> 

なぜこのような現象が発生するのですか?

答えて

2

その動作の理由は、scope chainingです。スコープは常にActiveRecord::Relationを返しますが、average_size_testメソッドのaverageコールではnilが返されますが、結果は返されません。

+0

しかし、Railsの公式ガイドには、「これはクラスメソッドを定義するのとまったく同じです。あなたが使用するのは個人的な好みの問題です。」http://guides.rubyonrails.org/active_record_querying.html#scopes –

関連する問題