acts_as_taggable_on 使用 OR 进行多字段查询

acts_as_taggable_on multiple fields query using an 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 即主要和次要, 我希望它是 OR,但我无论如何也想不出来

尝试 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)

我最终使用了 Rails 5 中引入的 ActiveRecord 的 or 方法,如@archana 所述。

但在我开始使用它之前,我试图找到另一种方法来做同样的事情,并研究了一下 acts_as_taggable_on 的设计方式。

所以即使有两个不同的关联称为 primary_skillssecondary_skills 两者确实是具有相同 table tags 的关联,但 [=32] =] taggings

这意味着 users table 与 tags table 有关联,现在一切都清楚了。解决方案是这样的:

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

这适用于支持 acts_as_taggable_on 的所有 rails 版本。