web-dev-qa-db-ja.com

Rails 4:has_manyアソシエーションで名前付きスコープを使用する方法

私のRails 4アプリプロジェクト(モデル)has_manyビデオ(モデル)です。ビデオモデルに名前付きスコープがあります:

scope :live, where( is_deleted: 0, sent_to_api: 1 )

私のプロジェクトビューの1つでこれを行います(プロジェクトはプロジェクトのインスタンスです)。

project.videos.live.size

その特定のプロジェクトにあるプロジェクトの数ですが、代わりににあるビデオの数を取得しますanyプロジェクト。 .live.videosからサブセットを返さず、代わりにそれを置き換えるかのようです。

私はそれが説明されているのを見る here 名前付きスコープを相互にチェーンすることは論理ANDと組み合わせる必要があるが、「関連付け方法」に適用すると[<--_.videosの適切な用語がわからないこの状況]それは起こっていないようです。

これを行う正しい方法は何ですか?

19
emersonthis

Rails 4:

scope :live, -> { where(is_deleted: 0, sent_to_api: 1) }

Rails 4 docsとその中のすべての例は、呼び出し可能なオブジェクトをスコープに渡して、毎回確実に呼び出されることを示しています。このように機能しない場合は、クラスとして実装してみてくださいメソッドとそれがあなたのためにうまくいく方法を参照してください。

http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

26
Mike Waldrup

私はクラスメソッドを使用し、スコープは残しておきます。構文は、パラメーターを渡すことを含め、他のクラスメソッドと同じであるため、はるかに単純です。

試してください:

def self.live
  where( is_deleted: 0, sent_to_api: 1 )
end

その後:

project.videos.live.size

それが役立つかどうかを確認します。

詳しくは こちら をご覧ください。

3
mjnissim