【问题标题】:How to search comma separated words in Ruby如何在 Ruby 中搜索逗号分隔的单词
【发布时间】: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


【解决方案1】:

奇怪,因为您似乎只能使用 candidate.key_skills.map{|key| key.name}.join(",") 行中的 candidate 值。

但如果还需要实现这样的查询,则需要使用IN表达式:

Candidate.joins(:key_skills).where('key_skills.name IN (?)', @c_skill_name.split(','))

甚至更简单:

Candidate.joins(:key_skills).where(key_skills: { id: candidate.key_skills_ids })

【讨论】:

  • 先加入,再拆分?什么都不做不是更容易吗? :)
  • 谢谢。真的觉得很幸福。实际上,对于一个特定的候选人,我想这样做。所以我尝试了另一种方式。
  • @SergioTulentsev 我不明白为什么需要这个搜索,因为他在开头有candidate。哦,也许需要找到所有相似的候选人?
  • @zanadto:是的,看起来像“寻找相似”
  • 我仍然认为这会产生与调用 candidate.key_skills 相同的结果,完全是浪费时间。
猜你喜欢
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
相关资源
最近更新 更多