rails 5 поиск по has_many через

У меня три модели

class Project < ApplicationRecord
  has_many :project_skills
  has_many :skills, :through => :project_skills
end

class Skill < ApplicationRecord
  has_many :project_skills
  has_many :projects, :through => :project_skills
end

class ProjectSkill < ApplicationRecord
  belongs_to :skill
  belongs_to :project
end

Я хочу создать поиск, который находит все проекты, которые включают в себя набор навыков.

Например:

  • Project1 навыки: Java, Ruby, HTML
  • Project2 навыки: Ruby, C++.

Поэтому, когда я ищу "ruby", мой результат должен быть project1 и project2.

3 ответа

Решение
Project.joins(:skills).where(skills: { name: "c++" })

вернет проекты, которые имеют навык "C++".

Project.joins(:skills).where(skills: { name: ["c++", "ruby"] })

вернет проекты, которые имеют навыки "C++" или "ruby", или оба.

Я бы использовал includes метод, который позволяет ActiveRecord свободно определять наиболее оптимальный способ объединения таблиц. Кроме того, это выглядит хорошим кандидатом для области. Я предполагаю, что навыки названы с использованием поля name, но замените поле, которое вы фактически используете.

class Project < ApplicationRecord
  has_many :project_skills
  has_many :skills, :through => :project_skills

  scope :having_skill, -> (required_skill) { includes(:skills).where(skills: {name: required_skill}) }

end

Теперь вы можете сделать:

>> projects = Project.having_skill('ruby')

И получить обратно ActiveRecord Relation, содержащую набор результатов.

Если вы имеете в виду полнотекстовый поиск, я рекомендую solr с помощью sunspot как его клиент рельсов. Вы можете прочитать больше о солнечном пятне здесь.

Если, с другой стороны, вам нужно просто найти ассоциации, то это то, что я бы сделал.

#considering params[:name] = 'ruby'  
# also considering you have a name field on skills table :) You can use the field you use to store skill name. 
skill = Skill.find_by_name(params[:name])
@projects = skill.projects 
# This is what you need to get projects corresponding a particular skill in a has many through association. 

Но для очень сложного полнотекстового поиска я бы определенно рекомендовал solr

Другие вопросы по тегам