我有一个使用 Ramaze 和 Sequel 的 Ruby 应用程序。
我有课程Tag
并且Tagging
有这种关系:
class Tag < Sequel::Model
one_to_many :taggings, :class => 'Thoth::Tagging'
class Tagging < Sequel::Model(:taggings)
many_to_one :tag, :class => 'Thoth::Tag'
我想按受欢迎程度返回一个标签列表,那些标签最多的标签(过滤掉任何标签少于三个的标签)。我这样做是这样的:
tags = .left_outer_join(:taggings, :tag_id => :id).group(:tag_id).having("count(*) > 2").order("count(*) desc").all
这确实返回了似乎是标签对象的东西,但是当我调用.id
它们时,我得到了指向标签的标签的 id,而不是标签本身。
仔细观察,结果与常规发现完全不同:
> tag_regular = Tag[2]
=> #<Thoth::Tag @values={:title=>nil, :position=>nil, :parent_id=>1, :name=>"academic", :id=>2}>
> tag_from_join = Tag.join(:taggings, :tag_id => :id).group(:tag_id).having("count(*) > 2").order("count(*) desc").all.select{|tag| tag.name == "academic"}.first
=> #<Thoth::Tag @values={:tag_id=>2, :post_id=>5, :title=>nil, :position=>nil, :parent_id=>1, :name=>"academic", :id=>1611, :created_at=>nil}>
在这两种情况下,我都会得到一个 Thoth::Tag,但值是完全不同的,基于我想的连接中的不同字段。
我真正需要做的就是获取一个按标签数量排序的常规标签对象列表,但是以一种有效的单查询方式。有没有更好的办法?