別の関連モデルの値に基づいて常に行を並べ替えたいモデルがあり、これを実装する方法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に指示する方法はありますか?