Rails,按匹配标签的数量排序,然后按名称排序

时间:2013-01-30 17:17:25

标签: sql ruby-on-rails ruby-on-rails-3 has-many-through sql-order-by

以下是我想要做的事情:ListingTagTaggings之间存在多对多关系。我想允许用户按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(暂时忽略标题)。

2 个答案:

答案 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标记来优化查询。