0

モデル内のコレクションにメソッドを適用するのに問題があります。私のモデルは次のようになります。

class MyModel < ActiveRecord::Base
  def self.range(min, max)
    where(id: min..max)
  end

  def self.my_collection_method
    collect{|x| x.id}
  end
end

これは機能します:

MyModel.range(53, 55)
# [#<MyModel id: 53>, #<MyModel id: 54>]

そして、これは機能します:

MyModel.range(53, 55).collect{|x| x.id}
# [53, 54]

しかし、派手にしようとして、 collect の代わりに my_collection_method を使用する次のエラーが発生します。

MyModel.range(53, 55).my_collection_method
# NoMethodError: undefined method `collect' for #<Class:0x007fcbad3efc30>

どうすればこれを機能させることができますか?

あなたの時間と知恵をありがとう!!

4

2 に答える 2

3

何を達成しようとしているのかわかりませんが、最初にスコープを呼び出すときに使用できるはずです

def self.my_collection_method
  scoped.collect {|x| x.id}
end

なしで、モデルのメソッドではないscoped呼び出しを試みています。そこにあるということは、現在のチェーンに適用したいということです。self.collectActiveRecordscopedcollect

于 2013-03-04T11:28:57.807 に答える
2

コレクションではなくモデルで定義my_collection_methodしました-それらは別々のクラスです。通常、モデルメソッド内でやりたいことを達成できます。

class MyModel < ActiveRecord::Base
  def self.range(min, max)
    where(id: min..max)
  end

  def self.my_collection_method(min, max)
    range(min, max).collect{|x| x.id}
  end
end

他の唯一の方法は、その場でメソッドをコレクションにアタッチすることですが、それはかなり醜いものになるでしょう。

于 2013-03-04T11:28:16.613 に答える