2016-10-14 2 views
0

튜토리얼을 따라 레서피 웹 사이트에 태그 지정 방법을 만들었습니다. 나는 사용자가 선택한 ALL 태그가 조리법 선택하는 필터를 만들 싶습니다 내 레시피 지수에서레일 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 

하지만 모든 태그가있는 래서 피를 반환하지는 않습니다. 태그 배열에 마지막 태그가있는 래서 피를 반환합니다. 모든 태그가있는 래서 피만 반환하도록 수정하려면 어떻게해야합니까?

+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) } 행에 문제가 발생하면 Recipies을 가져 와서 tagged_with 메서드를 사용하여 작업을 마친 후 문제가 종료됩니다. 따라서 tags 배열의 모든 요소에 대해 inject은 연산을 수행하고 결과를 반환하지만 inject 연산의 다음 반복에 대해서는 결과를 tags에 전달하지 않습니다. 결국 마지막 태그에 대한 쿼리를 수행 한 후 반환 할 내용을 얻게됩니다.

이 같은 수행 할 수 있습니다 my_recipes = {:chinese => *all data returned for chinese*}

또는 당신이

같은 작업을 수행 할 수 있습니다 이후

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 

를 사용하면 같은 값으로 태그 이름과 키와 요리법 해시를 얻을 것이다

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

추신 : 필요한 코드를 테스트하지 않았으므로 필요한 조정을하십시오.