如何编写此 Rails ActiveRecord 多对多查询?



我通过JobStacksJobsStacks之间建立了多对多关系。我正在尝试编写一个 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)
)

相关内容

  • 没有找到相关文章

最新更新