2016-10-14 10 views
0

私はチュートリアルに従い、レシピのウェブサイトにタグ付けメソッドを作成しました。私は、ユーザーが選択したALLタグを持つレシピを選択するフィルタを作成したいのですが、私のレシピのインデックスでRails 4:タグ付きフィルタ

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

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

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

:私は、次のモデルを持っています。

私は与えられたタグを持つすべてのレシピを引っ張っする方法があります。

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

を...と私は単一のクエリに複数のタグを組み合わせることinjectを使用しようとしている:

def self.new_filter(tags) # tags is an array 
    tags.inject(Recipe.all) { |res, arg| res.tagged_with(arg) } 
end 

しかし、これはすべてのタグを含むレシピを返しません。最後のタグを含むレシピをtags配列に返します。すべてのタグを含むレシピのみを返すにはどうすればよいですか?

+0

これは少なくともあなたが指摘することができる答えを持っているhttp://stackoverflow.com/questions/17920505/match-all-in-active-record-relations-in-a-queryと非常によく似た質問です正しい方向。 – Jim

答えて

0

このtags.inject(Recipe.all) { |res, arg| res.tagged_with(arg) }の行では、を返すのは、tagged_withメソッドを使用して取り出した後で、操作がそこで終了するという問題です。したがって、tags配列のすべての要素に対して、injectは操作を実行し、結果を返しますが、の操作injectの次の反復で戻すことはありません。最後に、最後のタグのクエリを実行した後に返されるものはすべて取得します。この後はあなたのような値としてタグ名とレシピとしてキーを持つハッシュを取得します

def self.new_filter(tags) # tags is an array 
    res = Recipe.all; 
    tags.inject({}) { |all_res, arg| all_res[arg] = res.tagged_with(arg); all_res } 
end 

my_recipes = {:chinese => *all data returned for chinese*}

か、

ような何かを行うことができます

あなたはこのような何かを行うことができます

def self.new_filter(tags) # tags is an array 
Recipe.joins(:tags).where('tags.name IN (?)', tags) 
end 

PS:コードはテストしていません。必要に応じて調整してください。

関連する問題