如何绕过Datamapper中的战略急切加载?

时间:2012-03-08 21:55:03

标签: ruby database datamapper

我正在使用Ruby和Datamapper处理大量的书籍记录(1250万)。在极少数情况下,我需要获取特定书籍记录的关联标识符,但Datamapper正在创建一个select语句,用于获取所有书籍记录的所有关联标识符。查询需要2分钟以上。

http://datamapper.org/why.html

帮助文件说这是“战略急切加载”和......

“我们的想法是你不会加载一组对象,只使用其中一个对象。这应该可以很好地抵抗99%的规则。

如果您不希望它像这样工作,只需在自己的集合中加载您想要的项目。所以DataMapper提前思考。我们喜欢称它为“默认的高性能”。此功能单独消除了“N + 1查询问题”。“

但是,如何在其自己的集合中加载项目?我似乎无法找到一种方法来指定我真的只想查询其中一本书记录的标识符。

1 个答案:

答案 0 :(得分:0)

如果您遇到此问题,可能是因为您使用的是Model.first()而不是Model.get()。请参阅我在问题下的评论。

从DM 1.1.0开始......

使用Model.first的示例:

# this will create a select statement for one book record
book = Books.first(:author => 'Jane Austen')

# this will create select statement for all isbns associated with all books
# if there are a lot of books and identifiers, it will take forever
book.isbns.each do |isbn|
  # however, as expected it only iterates through related isbns
  puts isbn
end

这与使用Book.all,然后在一个

上选择关联的行为相同

使用Model.get的示例:

# this will create a select statement for one book record
book = Books.get(2345)

# this will create select statement for book with a primary key of 2345
book.isbns.each do |isbn|
  puts isbn
end