1

ドキュメントによると、このコードが機能するのはなぜですか? http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

class Article < ActiveRecord::Base
  scope :featured, where(:featured => true)

  def self.titles
    map(&:title)
  end
end

Article.featured.titles

私のコンソールで取得:

NoMethodError: undefined method `map' for #<Class:0xb70bfb0>
4

3 に答える 3

2

この特定の動作が Rails 3.x でも Rails 4.x と同じである場合は、次を試してみてください。

class Article < ActiveRecord::Base
  scope :featured, where(:featured => true)

  def self.titles
    all.map(&:title)
  end
end

Article.featured.titles

オブジェクトのコレクションのためのRailsモデルクラスメソッドで@Nerminの厚意により回答し、後世のためにここにコピーしました。だまされていますが、Rails のバージョンが異なると思うので、おそらくそうではありません。

ところで、私はhttps://github.com/rails/rails/issues/21943も提出しました。これは、せいぜい誤解を招くドキュメントの問題、または最悪のバグであるためです。

于 2015-10-13T03:56:12.883 に答える
1

これが機能するのは、返されたオブジェクト (AR::Relation) が 3 種類のメソッドを受け入れるためです。

1) :where、:includes、:joins、:limit などの AR::Relation の「ネイティブ」メソッド...

2) 列挙可能なメソッド。それらのほとんどは、Array であるスコープ コレクションに委譲されます。

3) その他のメソッド: ' method_missing 'を介して基本クラスに委譲

したがって、その部分のAPIドキュメント(クラスメソッドとの連鎖)は間違っています:)

于 2013-01-07T13:57:16.360 に答える
1

私の最初の答えは正しいものでした:それはうまくいきません...

ドキュメントが支配するべきなので、私は最終的に自分自身を納得させたと思います...

このドキュメントで重要なのは、クラス メソッドでスコープを連鎖できるという考え方だと思います。

しかし、例で示したクラス メソッドの実装は明らかに間違っています。

于 2013-01-07T12:35:47.117 に答える