【发布时间】:2018-06-18 09:20:17
【问题描述】:
我想列出具有关键技能的候选人(例如:想要列出具有 CSS、HTML 或 CSS5 等关键技能的候选人)。 有一个 Candidate 表和一个 KeySkill AND CandidateKeySkills 表。
添加的Keyskills 以属性名称存储在keyskills 表中。在candidate_key_skills 表中存储了candidate_id 和keyskill_id。
我与候选人的模型关系
candidate
has_many :candidate_key_skills, dependent: :destroy
has_many :key_skills, through: :candidate_key_skills
end
class CandidateKeySkill < ActiveRecord::Base
belongs_to :candidate
belongs_to :key_skill
end
class KeySkill < ActiveRecord::Base
belongs_to :candidate
has_many :candidate_key_skills
has_many :candidates, through: :candidate_key_skills
end
我像这样在视图页中获取候选计数,但是在键技能名称搜索部分中的 SQL 错误。
<% @candidates.each do |candidate| %>
<% @c_skill_name = candidate.key_skills.map{|key| key.name}.join(",") %>
<% @keyskills = Candidate.joins(:key_skills,:candidate_key_skills).includes({candidate: [:rate_card, :category, :company, :city, :key_skills]}).where('key_skills.name like ?',"#{@c_skill_name}") %>
<% count = @keyskills.count %><%end %>
终端中的 SQL
SELECT COUNT(*) FROM `candidates`
INNER JOIN `candidate_key_skills` ON `candidate_key_skills`.`candidate_id` = `candidates`.`id`
INNER JOIN `key_skills` ON `key_skills`.`id` = `candidate_key_skills`.`key_skill_id`
INNER JOIN `candidate_key_skills` `candidate_key_skills_candidates` ON `candidate_key_skills_candidates`.`candidate_id` = `candidates`.`id`
WHERE (key_skills.name like 'css,css5,html')
它确实列出了具有这些关键技能的候选人的数量。
【问题讨论】:
-
你为什么不直接使用
candidate.key_skills呢?看来您正在四处走动以获得简单使用它的结果。 -
你处理这个问题的方式有很多问题。您可能希望提供有关系统中黑白候选人和关键技能关系的更多详细信息。此外,
like查询也不能这样工作。您可能正在寻找IN(在数据库级别)。 -
我只是想变成这样 "@c_skill_name = "css","css5","html" " 而不是 "@c_skill_name = "css,css5,html"
-
@SRack 实际上我缩短了我的查询。实际上查询是这样的。 " Candidate.joins(:key_skills,:candidate_key_skills).includes({candidate: [:rate_card, :category, :company, :city, :key_skills]}).where('key_skills.name like ?',"#{@ c_skill_name}") "
-
@c_skill_name = "css","css5","html"可能没有按照您的想法行事。
标签: ruby-on-rails activerecord ruby-on-rails-5