【发布时间】:2014-08-03 18:36:21
【问题描述】:
我正在为一个小型应用程序构建数据模型,并希望在某些方法中利用预先加载的优势 - 即我事先知道某些关联将被使用的方法。
我已经阅读了the Sequel::Model::Association.eager 方法的指南,但它让我有些困惑。一个典型的例子可能是:
Artist.eager( :albums => :tracks ).all
加载所有 Artist 对象,并预加载所有专辑字段,并预加载所有曲目,仅使用三个查询。到目前为止,一切顺利。
但是假设我想通过其主键加载单个艺术家,并且仍然预先加载专辑 + 曲目(仍然是三个查询,可能比跟踪每个专辑的关联要少得多)?我看不到任何这样的例子。一个小实验给了我
Artist.eager( :albums => :tracks ).where( :id => id ).all.first
这似乎至少有效。我通过调用它确认了急切加载,然后关闭了数据库,并显示我仍然可以访问关联。
但是,我觉得我错过了一些东西。该构造必须将主键传递给where 子句,获得完整的数据集然后要求第一项似乎很尴尬。我正在寻找这样的东西:
Artist.eager( :albums => :tracks )[ id ]
。 . .声明我想要加载单个对象并急切加载它的一些关联的简单方法。
我有发现我可以像这样创建自定义关联:
def eager_albums
albums_dataset.eager( :tracks ).all
end
但这很难用,因为代码必须以不同的方式请求关联。
我的问题:我的构造 Artist.eager( :albums => :tracks ).where( :id => id ).all.first 是否像我在 Sequel 中所做的那样认为,我可以做得更好(更简单的代码)吗?
【问题讨论】: