我通过JobStacks
在Jobs
和Stacks
之间建立了多对多关系。我正在尝试编写一个 ActiveRecord 查询来返回包含传递给它的所有堆栈的作业。
class Job < ApplicationRecord
has_many :job_stacks
has_many :stacks, through: :job_stacks
end
class JobStack < ApplicationRecord
belongs_to :job
belongs_to :stack
end
class Stack < ApplicationRecord
has_many :job_stacks, dependent: :destroy
has_many :jobs, through: :job_stacks
end
这将创建一个 SQLIN
查询,返回包含任何堆栈的作业。
Job.joins(:stacks).where(stacks: {name: ['JavaScript', 'Python']})
有没有类似的方法可以将包含所有Stacks
的返回Jobs
编写为来自Jobs
的.where
调用?
这是一种仅使用数据库STRING_AGG函数即可获取结果的方法
Job.joins(:stacks).select("STRING_AGG(stacks.name) AS stack_name").group('stacks.job_id').having("stack_name= 'JavaScript,Python'")
ARRAY_AGG还有另一种方法,我没有使用过,但我认为您也可以尝试使用它。
你可以试试这个:
names = ['JavaScript', 'Python']
Job.where(id:
Stack.
where(name: names).
select(:job_id).
group(:job_id).
having("count(*) >= ?", names.size)
)