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'
タグのリストを人気順に返したいと思います。タグ付けが最も多いものです (タグ付けが 3 つ未満のものは除外します)。私はこのようにしています:
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 を取得しますが、結合のさまざまなフィールドに基づいて、値がまったく異なります。
私が実際に行う必要があるのは、タグ付けの数でソートされた通常のタグ オブジェクトのリストを取得することだけですが、効率的な単一クエリの方法で行います。より良い方法はありますか?