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