[英]Use all strings in an array to search through a has_many association
Im building a search field for my profile model, the search field takes in a list of skills separated by comas and find the profiles that have those skills. 我为个人资料模型构建了一个搜索字段,该搜索字段接受以逗号分隔的技能列表,并找到具有这些技能的资料。 The code splits up the string by comas into multiple strings in an array. 该代码通过逗号将字符串分成多个数组。 Now I am trying to find profiles that have all the skills in that array but I can't seem to wrap my head around it. 现在,我正在尝试找到具有该阵列所有技能的配置文件,但似乎无法将其包裹住。 I've tried playing around with PSQL code in where() but I can only seem to get it to work with 1 of the skills. 我曾尝试在where()中使用PSQL代码,但似乎只能使它与其中一种技能一起使用。
I am following the advanced search guide by ryan bates. 我正在关注ryan bates的高级搜索指南。
Profile.rb Profile.rb
class Profile < ApplicationRecord
belongs_to :user, dependent: :destroy
has_many :educations
has_many :experiences
has_many :skills
has_many :awards
has_many :publications
def owner? user
if self.user == user
return true
else
return false
end
end
end
business_search.rb business_search.rb
class BusinessSearch < ApplicationRecord
def profiles
@profiles ||= find_profiles
end
private
def find_profiles
profiles = Profile.all
if self.skills.present?
profiles = profiles.joins(:skills)
skills_array(self.skills).each do |skill|
profiles = profiles.where('skills.name_en = :q or skills.name_ar = :q', q: skill)
end
end
profiles
end
def skills_array(skills)
return skills.split(/,/)
end
end
business_search_controller.rb business_search_controller.rb
class BusinessSearchesController < ApplicationController
def new
@search = BusinessSearch.new
end
def create
@search = BusinessSearch.create!(search_params)
redirect_to @search
end
def show
search = BusinessSearch.find(params[:id])
@profiles = search.profiles
end
private
def search_params
params.require(:business_search).permit(:first_name, :education_field, :skills)
end
end
Adavanced search view 进阶搜寻检视
<h1>Advanced Search</h1>
<%= form_for @search do |f| %>
<div class="field">
<%= f.label :skills %><br />
<%= f.text_field :skills %>
</div>
<div class="actions"><%= f.submit "Search" %></div>
<% end %>
Try this query: 试试这个查询:
def find_profiles
return Profile.all if skills.blank?
Profile.joins(:skills)
.where('skills.name_en IN (:skills) OR skills.name_ar IN (:skills)', skills: skills_array(skills))
.group('profiles.id')
.having('COUNT(skills.id) = ?', skills_array(skills).size)
end
Try this one: 试试这个:
def find_profiles
return Profile.all if skills.blank?
Profile.joins(:skills).where('skills.name_en IN (:skills) OR skills.name_ar IN (:skills)', skills: skills_array(skills))
end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.