Rails 求助:同音的属性名称查询以及类似需要对属性进行转化后对比的查询处理

y9info · 2021年12月13日 · 最后由 fftq1688 回复于 2021年12月17日 · 322 次阅读

有一个商标表,包括商标名称(名称统一都是汉字)、商标号码等等,现在需求是:在用户输入一个商标名称时,可以查询同名、同音的商标。 例如:输入查询商标名称“华为”,查询结果可以显示出“华为”、“化为”、“华威”、“华微”、"花薇”等等同名、同音的商标。

目前考虑解决办法是,在商标表中,增加一列 pinyin 名称,在创建商标时,自动生成一列拼音的名称属性“name_pinyin"存储名称的汉语拼音,再创建组合查询如下 ,但是考虑这种增加仅仅为方便查询所用增加列,感觉不美,不知道有没有更简洁的查询处理方法?

search_result = trademarks.where("name like ? or name_pinyin like ?", name,  Pinyin.t(name))

从上面的问题衍生出来一个问题:如果对象属性列中,包含一个属性,但是需要对该属性进行必要的转化、清洗后才能对比查询的的简洁处理方法是?

譬如:一张学生列表,只保存了姓名、身份证号,班级等等,没有性别这一列(按照表尽量简单的原则,身份证号码可以查询性别、出生日期就没单独增加性别、出生日期的属性),现在要通过身份证号码查出性别为男生、出生月份为 9 月的学生(仅做举例,所以表尽可能设置的简单,没有出生年月和性别的列,需要从身份证中推导)。 如果不增加列,简洁的处理方法是?

增加索引列用于查询就是挺好的方案呀

如果说通过匹配身份证号,还勉强可以完成出生年月、性别的查询,要直接通过拼音查询数据库的中文汉字,还真想不到具体的做法

但是即使有,也不建议在查询过程中引入过于复杂的逻辑而消耗性能,毕竟谁也不愿意在查询的时候等很久,对吧

感谢回复,你的为避插入查询逻辑消耗性能的观点是正确的,相比代码简洁来说,插入索引列更有优势,查询性能更重要。

目前已经通过增加索引列解决了。因为 rails 查询接口的 where 后面只能接列名(对象属性),接其他的,都会显示没有该列名的查询错误。 原来有点期望类似如下这种简洁的查询方案,但实际上会出现错误。

search_result = trademarks.where(" Pinyin.t(name) like ? ", Pinyin.t(params[:name] ))

search_students = students.where("get_month(id_code) = '9')
y9info 回复

Rails 的 where 方法最终是生成 sql 查询语句执行的,所以只要是 sql 支持的方法还是可以使用的,例如想要在查询时忽略大小写:

TradeMark.where('lower(name) = ?', name.downcase)

这样解释,整个人对这个问题点就通透了,否则光解决了问题,不通透还是不舒爽。👏

通透了通透了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号