1

我有一个模型,我总是想根据另一个关联模型中的值对其行进行排序,我认为实现这一点的方法是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_fieldsitems(我想将导入的数据与计算的数据分开,但我不必这样做)。不过,首先,我只想了解您可以使用数据集走多远,并且仍然可以获取对象而不是哈希。

如果我将数据集设置为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而不是#each检索结果才能处理图形(因为如果没有预先设置所有实例,您无法急切加载),或者使用eager_each插件(在内部进行#each调用#all)。

于 2012-11-16T20:19:28.803 回答