我正在使用DataMapper,一个用于 ruby 的开源 ORM,我很想从头开始。目前,DataMapper 可以将战略渴望加载(SEL)用于一对多关系,但不能使用 N+1 查询发生的多对多关系。我想设法使这项工作正常工作,但我找不到在哪里做。所以两部分问题:
- 如何运行测试套件以使其显示失败(注意,现在所有应该失败的规范都标记为待处理)?
- SEL 在哪里以及如何为一对多关系实施?
我正在使用DataMapper,一个用于 ruby 的开源 ORM,我很想从头开始。目前,DataMapper 可以将战略渴望加载(SEL)用于一对多关系,但不能使用 N+1 查询发生的多对多关系。我想设法使这项工作正常工作,但我找不到在哪里做。所以两部分问题:
对于第二个问题,您可以尝试深入研究代码:
/lib/dm-core/associations/relationship.rb
# Eager load the collection using the source as a base
#
# @param [Collection] source
# the source collection to query with
# @param [Query, Hash] query
# optional query to restrict the collection
#
# @return [Collection]
# the loaded collection for the source
#
# @api private
def eager_load(source, query = nil)
targets = source.model.all(query_for(source, query))
# FIXME: cannot associate targets to m:m collection yet
if source.loaded? && !source.kind_of?(ManyToMany::Collection)
associate_targets(source, targets)
end
targets
end
./lib/dm-core/associations/one_to_many.rb:
def lazy_load(source)
return if loaded?(source)
# SEL: load all related resources in the source collection
if source.saved? && (collection = source.collection).size > 1
eager_load(collection)
end
unless loaded?(source)
set!(source, collection_for(source))
end
end