0

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 を取得しますが、結合のさまざまなフィールドに基づいて、値がまったく異なります。

私が実際に行う必要があるのは、タグ付けの数でソートされた通常のタグ オブジェクトのリストを取得することだけですが、効率的な単一クエリの方法で行います。より良い方法はありますか?

4

1 に答える 1

1

デフォルトの選択はであるため、と*の両方から列を選択しています。両方のテーブルに列がある場合、Sequel は列名をキーとするハッシュとしてレコードを返すため、テーブル内の列はテーブル内の同じ名前の列を上書きします。tagstaggingsidtaggingstags

の列のみが必要な場合は、データセットtagsに追加select_all(:tags)します。

Sequel マスター ブランチには、table_selectデフォルトでこの状況を処理するプラグインがあります。

于 2013-10-16T15:08:18.567 に答える