我的数据库中有两个条目

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 (按顺序排列)将较大的交叉点放在前面,否定结果是扭转通常的排序顺序的一种简单方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top