我有一个模型,我总是想根据另一个关联模型中的值对其行进行排序,我认为实现这一点的方法是set_dataset
在模型中使用。但是,这导致查询结果以哈希而不是对象的形式返回,因此在迭代数据集时不能使用该类中的任何方法。
我基本上有两个班
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
是根据一些复杂的规则从多个其他关联表(一些一对多,一些多对多)中计算出来的。可能的解决方案是将值添加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 在它想要返回哈希时返回对象?