以下是我想要做的事情:Listing
与Tag
到Taggings
之间存在多对多关系。我想允许用户按title
(列表)和name
(零个或多个标签)搜索列表。我想首先按匹配的标签数量最多的列表排序结果数量,然后按标题排序。
似乎此问题之前已经完成 - 它可能与从MySQL匹配此问题(Ordering items with matching tags by number of tags that match)一样简单。但是,我根本不懂SQL,这就是我寻求帮助的原因。
更新的 这是我想要的一个例子。
说我有3个房源。
listing1
标记为“幽默”,“有趣”和“搞笑”。
listing2
= 2标签“有趣”,“愚蠢”和“傻瓜”。
listing3
= 3标签“有趣”,“愚蠢”和“高飞”。
listing4
= 4的标签为“完全严重”。
如果我使用“搞笑”和“愚蠢”的标签进行搜索,我应该得到的是清单2,清单3,清单1和清单4(暂时忽略标题)。
答案 0 :(得分:1)
有趣的问题。我想你可能不得不使用一些SQL糖来做这个范围。
这样的事情:
Listing
.joins("LEFT JOIN taggings ON taggings.listing_id = listings.id")
.joins('LEFT JOIN tags ON tags.id = taggings.tag_id AND tags.name IN ("funny","silly")')
.group(:id)
.order("count(tags.id), name DESC")
这有帮助吗?
答案 1 :(得分:0)
假设你想在纯ActiveRecord中使用一个解决方案,以免触及任何SQL ......
Listing.order("tags.count DESC, title")
在这种情况下,您最好使用counter cache标记来优化查询。