acts_as_taggable_on使用OR进行多个字段查询

时间:2016-12-07 18:21:19

标签: ruby-on-rails ruby ruby-on-rails-5 acts-as-taggable-on

所以我正在尝试编写一个查询来根据他们的技能获取用户,实现如下:

用户具有使用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)
现在的问题是,如果主要和&如果存在secondary,则触发的查询将是AND,即主要和次要, 我希望它是一个OR,而且我无法理解

2 个答案:

答案 0 :(得分:2)

尝试在Rails 5中引入or

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)

答案 1 :(得分:0)

我最终使用了@archana提到的Rails 5中引入的ActiveRecord的or方法。

但在我开始使用之前,我试图找到另一种方法来做同样的事情,并看一下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的所有rails版本。