ruby-on-rails - 如何在 Rails 中使用关联搜索 group_by

标签 ruby-on-rails ruby

我不知道如何描述这个问题,首先我想展示我的模型,它保持如下关系

类别.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_categoriesjobs 连接到相关键上,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/

相关文章:

javascript - RoR - 将提交表单转换为 AJAX

ruby-on-rails - 电影院预订申请

python - 我可以找到相似的条目并将它们组合在一起吗?

ruby-on-rails - Rails Geocoder Gem 如何访问 Google API?

ruby - 将格式作为参数传递给 rake spec

ruby-on-rails - Rails 复选框和序列化数据

ruby-on-rails - Rails Mongoid `pluck` 等效?

ruby-on-rails - 是否仍然可以在 Rails 4 中使用测试单元?

ruby - 有人说模块既有行为又有状态,这是什么意思?

ruby - Ruby 中 "return x if x"的简写