我正在尝试查询具有一组特定关联的记录。这是一种通过联接进行的存在查询。我想查询恰好具有skill_1、skill_2、skill_3和level_a、level_B、level_c的用户
class User < ApplicationRecord
has_many :skills
end
class Skill < ApplicationRecord
belongs_to :user
end
# example of current attempt and intended use
def user_exists?(skills, levels)
User.joins(:skills).where(skill_name: skills, skill_level: levels)
end
这将给予用户提供技能中的技能和级别中的级别,这将返回技能和级别集的各种组合,但我只希望用户在这些级别上拥有这些技能。
我如何编写该查询?
1条答案
按热度按时间6jjcrrmo1#
假设我有
skills = ['a','b','c']
和levels = [1,2,3]
。根据您的问题,有2种可能的迭代:
1.这是2的乘积,例如
[["a", 1], ["a", 2], ["a", 3], ["b", 1], ["b", 2], ["b", 3], ["c", 1], ["c", 2], ["c", 3]]
;或1.它应该是
[["a", 1], ["b", 2], ["c", 3]]
这将生成以下SQL:
skills.size == levels.size
)这将生成以下SQL:
备选案文2也可写成:
这将为以下技能生成WHERE子句
还有其他方法可以完成这些查询,例如使用交集查询,但构造有点不那么直接。