题
我的数据库中有两个条目
OBJ1标记为“ Hello,World,Planet” OBJ2标记为“ Hello”
如果我执行modelname.tagged_with([“ Hello”,“ World”,“ Planet”,“ arth”],:Any => true)
我想按匹配的标签数量最高到最低数量的返回对象。因此,在这种情况下,我希望订单成为OBJ1,OBJ2
我怎样才能做到这一点?是否有一种方法可以获取每个返回结果的标签数量?
解决方案
你可以打电话 tag_list
在对象上,并用它来弄清楚有多少个标签:
tags = %w{hello world planet earth}
objs = ModelName.taggedWith(tags, :any => true)
objs.sort_by! { |o| -(tags & o.tag_list).length }
这 tags & o.tag_list
产生您要查找的标签和找到标签的交叉点,然后我们否定交叉口的大小要告诉 sort_by
(按顺序排列)将较大的交叉点放在前面,否定结果是扭转通常的排序顺序的一种简单方法。
不隶属于 StackOverflow