0

这就是我想做的:与throughListing建立多对多关系。我想允许用户通过(列表)和(零个或多个标签)搜索列表。我想首先按匹配标签数量最多的列表排序结果数量,然后按标题排序。TagTaggingstitlename

似乎这个问题以前已经做过了——它可能就像从 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(暂时忽略标题)。

4

2 回答 2

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")

这有帮助吗?

于 2013-02-02T00:16:03.497 回答
0

假设您想要一个纯 ActiveRecord 的解决方案,以免触及任何 SQL ......

Listing.order("tags.count DESC, title")

在这种情况下,您最好使用计数器缓存来优化您的查询。

于 2013-01-30T17:55:12.393 回答