1

別の関連モデルの値に基づいて常に行を並べ替えたいモデルがあり、これを実装する方法set_datasetはモデルで使用することだと考えていました。ただし、これによりクエリ結果がオブジェクトではなくハッシュとして返されるため、データセットを反復処理するときにクラスのメソッドを使用することはできません。

基本的に2つのクラスがあります

class SortFields < Sequel::Model(:sort_fields)
    set_primary_key :objectid
end

class Items < Sequel::Model(:items)
    set_primary_key :objectid
    one_to_one :sort_fields, :class => SortFields, :key => :objectid
end

いくつかの裏話:データはレガシーシステムからmysqlにインポートされます。の値はsort_fields、いくつかの複雑なルールに従って、他の複数の関連テーブル(1対多、多対多)から計算されます。考えられる解決策は、に値を追加することsort_fieldsですitems(インポートされたデータを計算されたデータから分離したいのですが、そうする必要はありません)。ただし、最初に、データセットをどこまで使用しても、ハッシュではなくオブジェクトを取得できるかを理解したいと思います。

itemsそのようにフィールドでソートするようにデータセットを設定した場合

class Items < Sequel::Model(:items)
    set_primary_key :objectid
    one_to_one :sort_fields, :class => SortFields, :key => :objectid
    set_dataset(order(:sortnumber))
end

次に、期待される句が生成されたSQLに追加されます。例:

>> Items.limit(1).sql
=> "SELECT * FROM `items` ORDER BY `sortnumber` LIMIT 1"

クエリは引き続きオブジェクトを返します。

>> Items.limit(1).first.class
=> Items

ただし、関連するフィールドで並べ替えると...

class Items < Sequel::Model(:items)
    set_primary_key :objectid
    one_to_one :sort_fields, :class => SortFields, :key => :objectid
    set_dataset(
        eager_graph(:sort_fields).
        order(:sort1, :sort2, :sort3)
    )
end

...ハッシュを取得します

?> Items.limit(1).first.class
=> Hash

私が最初に考えたのは、これはからのすべてのフィールドsort_fieldsが結果に含まれているためであり、おそらく、からのフィールドのみを選択すると、オブジェクトが再びitems取得されるためです。Items

class Items < Sequel::Model(:items)
    set_primary_key :objectid
    one_to_one :sort_fields, :class => SortFields, :key => :objectid
    set_dataset(
        eager_graph(:sort_fields).
        select(:items.*).
        order(:sort1, :sort2, :sort3)
    )
end

生成されたSQLは、私が期待するものです。

>> Items.limit(1).sql
=> "SELECT `items`.* FROM `items` LEFT OUTER JOIN `sort_fields` ON (`sort_fields`.`objectid` = `items`.`objectid`) ORDER BY `sort1`, `sort2`, `sort3` LIMIT 1"

バージョンと同じ行を返しますset_dataset(order(:sortnumber))が、それでも機能しません。

>> Items.limit(1).first.class
=> Hash

ソートフィールドをitemsテーブルに追加して、すべてが同じモデルで幸せに暮らせるようにする前に、ハッシュを返したいときにオブジェクトに戻るようにSequelに指示する方法はありますか?

4

1 に答える 1

1

を使用する場合は、グラフを処理するために結果を取得する代わりにを#eager_graph使用するか(すべてのインスタンスを事前に用意しないと熱心にロードできないため)、プラグインを使用する必要があります(内部で呼び出しを行います)。#all#eacheager_each#each#all

于 2012-11-16T20:19:28.803 に答える