2016-12-07 13 views
1

Так я пытаюсь написать запрос для выборки пользователей на основе навыков, которые они имеют, реализация выглядит следующим образом:acts_as_taggable_on нескольких полей запроса используя OR

Пользователь имеет первичные и вторичные навыки, как с помощью acts_as_taggable_on

это сфера я получил в настоящее время

scope :by_skills, (lambda do |primary, secondary| 
    if primary.present? && secondary.present? 
    tagged_with(primary, on: :primary_skills, any: true) 
     .tagged_with(secondary, on: :secondary_skills, any: true) 
    elsif primary.present? 
    tagged_with(primary, on: :primary_skills, any: true) 
    elsif secondary.present? 
    tagged_with(secondary, on: :secondary_skills, any: true) 
    end 
end) 

проблема с этим теперь, что если обеими первичными & вторичными присутствуют, запрос уволил бы AND то есть первичный и с condary, Я хотел бы, чтобы это было OR, и ни в коей мере я я в состоянии понять, что из

+0

Проклятье, почему я не подумал об этом. Позвольте мне попробовать. спасибо :) – Alfie

+0

вы попробовали? – archana

ответ

2

Постарайся or введен в Rails 5.

scope :by_skills, (lambda do |primary, secondary| 
    if primary.present? && secondary.present? 
    tagged_with(primary, on: :primary_skills, any: true).or(
     tagged_with(secondary, on: :secondary_skills, any: true)) 
    elsif primary.present? 
    tagged_with(primary, on: :primary_skills, any: true) 
    elsif secondary.present? 
    tagged_with(secondary, on: :secondary_skills, any: true) 
    end 
end) 
+0

Да, это сработало. спасибо :) – Alfie

+0

Но я собираюсь добавить еще один ответ, который будет работать для всех версий rails, поддерживаемых act_as_taggable_on. – Alfie

0

я в конечном итоге с помощью метода or ActiveRecord, который был введен в Rails 5, как упоминалось @archana.

Но до того, как я добрался до этого, я попытался найти другой способ сделать то же самое, и немного посмотрел на то, как дизайн acts_as_taggable_on.

Таким образом, даже если есть две различные ассоциации называют primary_skills & secondary_skills как действительно ассоциация с той же таблицей tags с помощью таблицы taggings

Это означает, что users таблица имеет связь с tags столом, полагая, что теперь все стало яснее. Решение выглядит следующим образом:

Users.includes(:primary_skills, :secondary_skills).where(tags: { name: (primary + secondary) }) 

Это будет работать для всех версий рельсов, где acts_as_taggable_on поддерживается.

 Смежные вопросы

  • Нет связанных вопросов^_^