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_skills
和 secondary_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 版本。
所以我正在尝试编写一个查询来根据他们拥有的技能来获取用户,实现方式如下:
一个用户有主要和次要技能,都使用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_skills
和 secondary_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 版本。