2014-11-03 2 views
0

레일 4.1 앱에서 acts_as_taggable_on gem을 사용하고 있습니다. 태그 또는 여러 태그를 기준으로 검색 범위를 사용하고 있습니다. 여러 태그가 매개 변수로 주어질 때 나는 모든 태그를 포함하는 태그가 달린 항목 만 반환하도록 검색을 원합니다. 현재 I 범위는 태그 (tag_a 또는 tag_b 또는 tag_c) 중 적어도 하나를 포함하는 태그가있는 항목을 반환합니다. 대신 범위가 AND 조건 (tag_a AND tag_b AND tag_c)이 필요합니다. 검색 PARAMS이 programmingruby을 포함하는 경우레일스 활성 레코드 쿼리 - 여러 값 조건 (OR 대신 AND)

document_a_tags = ['programming', 'ruby'] 
document_b_tags = ['programming', 'python'] 

class User < ActiveRecord::Base 
    has_many :documents, dependent: :destroy 
    scope :with_fields, proc { |fields| 
    if fields.reject!(&:empty?).present? 
     joins(documents: [{ taggings: :tag }]).where(tags: { slug: fields }) 
    end 
    } 
end 

class Document < ActiveRecord::Base 
    acts_as_taggable 
    belongs_to :user 
end 

현재 모두 document_a 및 document_b가 반환됩니다. 원하는 것은 검색 매개 변수에 programmingruby이 포함 된 경우 document_a 만 반환되는 범위입니다.

+0

시도해 보셨습니까 : 'tagged_with'? 예 :'Item.joins (문서 : [{tagging : : tag}]). tagged_with (fields)'? – Surya

+0

@ User089247 귀하의 제안에 감사드립니다. 태그가 Document 모델이 아닌 User 모델 : NoMethodError (# diasks2

+0

@ diask2 : 필자는'User ... '라고 쓰지는 않았다. 그러나'Item .. '이었지만 예제와 실제 코드의 차이점을 이해하고 그 아이디어를 사용하여 솔루션을 작동시켜야한다. – Surya

답변

0

mysql이 작동하는 방식을 감안할 때 단일 활성 레코드 쿼리에서 달성하기가 어렵다고 생각합니다.

조인은 항목에 연결된 각 태그에 대해 하나의 행을 추가하며 조건은 한 번에 한 행에만 적용됩니다. 즉, 결과에서 특정 행을 나타내는 조건에 의해 행을 제외 할 수 없습니다.

결과에 몇 개의 미결정 된 수의 열을 추가하고 조건을 적용하는 복잡한 재귀 쿼리를 작성할 수 있다고 생각합니다. 하지만 단순히 현재 범위를 사용하고 나서 모든 태그를 사용하지 않고 루비 코드 폐기 항목을 사용하는 것이 훨씬 쉽고 더 효과적 일 것이라고 생각합니다.

편집 : 사용중인 보석에서 가능할 수 있습니다. 보세요 :

User.tagged_with(["awesome", "cool"], :match_all => true) 
+0

감사합니다. 그러나이 범위는 사용자 모델에 있지만 태그가있는 문서 모델 (사용자 has_many : documents)이므로 tagged_with를 사용하면'NoMethodError (정의되지 않은 메서드 'tagged_with'for # diasks2

+0

이것은 설명서에서 복사 된 예제 일 뿐이므로 설정에 맞게 조정해야합니다. – Albin

+0

이것이 올바른 대답 일 것입니다. – Fred

관련 문제