2016-10-18 12 views
0

に複雑なフィルタをONにする:Railsの4:私は私が私のタグモデルように私のレシピモデルを接続における多対多/持ち、多くのスルー関係持っ範囲

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :recipes, through: :taggings 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :recipe 
end 

class Recipe < ActiveRecord::Base 
    has_many :taggings 
    has_many :tags, through: :taggings 
end 

を...同じタグを持つレシピを範囲でフィルタリングする方法はありますか?私はスコープについては新しいですが、メソッドよりもはるかに便利であることがわかります。メソッドを使用してタグ名で検索とフィルタリングを行うことができます。例えば

これが私に与えられた名前でタグ付けされたすべてのレシピを取得します:

def self.tagged_with(name) 
    Tag.find_by_name!(name).recipes 
end 

答えて

-1

あなたは基本的には例えばI

範囲に最も関連法・チェーン(すべてではない*けれども)を変換することができます

:私のような何かをしようと思い、それが動作しない場合、それは

scope :tagged_with, ->(name) { find_by_name!(name).recipes } 

を判明する方法と参照:「この(バグのためにテストされていないノートを)してみてくださいdはall範囲に210

scope :tagged_with, ->(name) { where(:name => name).first.recipes } 

[*]メソッドチェーン上のスコープを使用しての大きな問題は、それが見つからない場合はfind/firstは時々奇妙なことを行うことができるということです... Railsの内のコード文字通り、デフォルトでいくつかのケース(これは私が起こるべきではないと思う本当に奇妙な振る舞いです)だから、ただ一つのアイテムしか見つけないスコープについては、スコープを気にしなくても、元のようにクラスメソッドを使用することがあります。

+0

申し訳ありませんが、これは動作しません。 –

+0

予想通りチェーン化ができません。 –

+0

はい、1つしか選択していないため、チェーンが許可されません。あなたはあなたの質問を、それが存在するかどうかをどのようにして使用するかの例で更新して、他の連鎖されたメソッドの具体例を与えてもらえますか?それは、a)あなたがしたいことが実際には行えないことb)あなたがやりたいことは、他のやり方でよりうまくいくことができることです –

関連する問題