如何基于数组常量创建Rails作用域实现字符串搜索?
解决方案
首先得明确:你的Skills类不是Active Record模型,AR自带的scope机制在这里用不上——AR的scope是基于数据库查询的,而你要操作的是内存里的静态数组,完全是两回事。不过我们可以写一个类方法,模拟你习惯的scope调用方式,实现数组搜索。
1. 精确匹配场景
如果需要严格匹配技能名称,直接用select筛选数组:
class Skills SALES_SKILLS = %w( Accounting Mentoring Negotiating Closing ) def self.sales_skills(skill) SALES_SKILLS.select { |s| s == skill } end end
调用方式和AR scope一致:Skills.sales_skills("Mentoring")会返回["Mentoring"]。
2. 模糊匹配场景
如果要支持关键词模糊搜索(比如输入"ment"能匹配到"Mentoring"),可以加上大小写不敏感的处理:
class Skills SALES_SKILLS = %w( Accounting Mentoring Negotiating Closing ) def self.sales_skills(skill) return SALES_SKILLS if skill.blank? # 空关键词返回全部 SALES_SKILLS.select do |s| s.downcase.include?(skill.strip.downcase) end end end
这样调用Skills.sales_skills("ment")会返回["Mentoring"],输入空值则返回所有销售技能。
额外说明
因为数组本身就是Enumerable对象,所以你可以像AR链式调用一样继续追加操作,比如:
Skills.sales_skills("ing").sort.reverse
会返回匹配关键词且倒序排序的结果。
内容的提问来源于stack exchange,提问作者Carl Edwards
相关产品推荐
相关产品推荐

