>这就是我想做的:Listing
通过Taggings
与Tag
具有多对多关系。我想允许用户按title
(列表)和name
(零个或多个标签)搜索列表。我想首先按匹配标签数量最多的列表对结果数进行排序,然后按标题排序。
似乎这个问题以前已经做过了——它可能就像从 MySQL 匹配这个问题(按匹配的标签数量对具有匹配标签的项目进行排序)一样简单。但是,我根本不懂SQL知识,这就是我寻求帮助的原因。
更新:这是我想要的一个例子。
假设我有 3 个房源。
listing1
有"幽默"、"有趣"和"搞笑"的标签。
listing2
= 2 有标签"有趣"、"愚蠢"和"愚蠢"。
listing3
= 3 有标签"有趣"、"愚蠢"和"愚蠢"。
listing4
= 4 具有"完全严重"标签。
如果我使用标签"有趣"和"愚蠢"进行搜索,我应该得到的是 listing2、listing3、listing1 和 listing4(暂时忽略标题)。
有趣的问题。我认为您可能必须使用一些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")
这有帮助吗?
假设你想要一个纯 ActiveRecord 的解决方案,以免触及任何 SQL...
Listing.order("tags.count DESC, title")
在这种情况下,最好使用标签的计数器缓存来优化查询。