我不知道如何描述这个问题,首先我想展示我的模型,它保持如下关系
类别.rb
class Category < ApplicationRecord
has_many :job_categories, dependent: :destroy
has_many :jobs, through: :job_categories
end
工作.rb
class Job < ApplicationRecord
has_many :job_categories, dependent: :destroy
has_many :categories, through: :job_categories
end
工作类别.rb
class JobCategory < ApplicationRecord
belongs_to :category, counter_cache: :jobs_count
belongs_to :job
end
架构.rb
create_table "categories", force: :cascade do |t|
t.string "name"
t.string "parent"
end
parent
是一个列,它维护像 Technology
这样的组,在这个 ruby,rails,programming
等下面是与技术相关的。
下面是我按类别显示组的查询
Category.select(:id, :name, :parent).group_by{|p| p.parent}
它是这样显示的
技术
- ruby
- rails
- 等等
现在我想按技术分组显示所有工作,我有这样的查询
Job.joins(:categories).where('lower(categories.parent) LIKE lower(?)', "%#{params[:parent]}%")
它显示错误的输出,比如如果我只有一份工作,类别是 ruby,rails
那么这一份工作会显示两次,一次用于 ruby,一次用于 rails。
谢谢
最佳答案
您的关联是正确的,您可以通过以下方式检索某些类别的所有唯一职位:
Job.joins(:job_categories).joins(:categories).where('lower(categories.parent) LIKE lower(?)', "%#{params[:parent]}%").distinct
这会将 jobs
与中间表 job_categories
和 jobs
连接到相关键上,where
子句将然后允许您选择要检索的内容。
SELECT DISTINCT "jobs" .*
FROM "jobs" INNER
JOIN "job_categories" ON "job_categories" ."job_id" = "jobs" ."id" INNER
JOIN "job_categories" "job_categories_jobs_join" ON "job_categories_jobs_join" ."job_id" = "jobs" ."id" INNER
JOIN "categories" ON "categories" ."id" = "job_categories_jobs_join" ."category_id"
WHERE
(
lower ( categories.parent ) LIKE lower ( "Technology" ) )
更新:
实际上,我们也不需要显式加入 job_categories
,以下内容就足够了:
Job.joins(:categories).where('lower(categories.parent) LIKE lower(?)', "%#{params[:parent]}%").distinct
SELECT DISTINCT "jobs".* FROM "jobs" INNER JOIN "job_categories" ON "job_categories"."job_id" = "jobs"."id" INNER JOIN "categories" ON "categories"."id" = "job_categories"."category_id" WHERE (lower ( categories.parent ) LIKE lower ( "Technology" ))
关于ruby-on-rails - 如何在 Rails 中使用关联搜索 group_by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716713/