Ruby on rails to_json:include on active record需要数据库

Ruby on rails to_json:include on active record需要数据库,ruby-on-rails,Ruby On Rails,我想生成一个具有一级关联的json字符串: @lines = Line.joins(:mems)\ .where(" lines.document_id = ? AND lines.text <> 'root' AND mems.review_after < ?", params[:id], Time.now())\ .to_jso

我想生成一个具有一级关联的json字符串:

@lines = Line.joins(:mems)\
             .where("     lines.document_id = ?
                      AND lines.text <> 'root'
                      AND mems.review_after < ?", params[:id], Time.now())\
             .to_json :include => :mems
我的开发日志如下:

  Line Load (0.4ms)  SELECT `lines`.* FROM `lines` INNER JOIN `mems` ON `mems`.`line_id` = `lines`.`id` WHERE ( lines.document_id = '30'
 AND lines.text <> 'root'
 AND mems.review_after < '2011-01-10 04:14:59')
  Mem Load (0.2ms)  SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 49)
  Mem Load (0.3ms)  SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 50)
  Mem Load (0.2ms)  SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 51)
  Mem Load (0.3ms)  SELECT `mems`.* FROM `mems` WHERE (`mems`.line_id = 52)
  Tag Load (0.1ms)  SELECT `tags`.* FROM `tags` WHERE (`tags`.`id` = 8) LIMIT 1
Rendered documents/review.erb within layouts/application (11.3ms)
如您所见,ActiveRecord对象生成一个带有内部联接的查询。但是,to_json方法会针对每个行记录分别查询关联的模型

有没有一种方法可以避免这些重复的查询,而无需编写自定义序列化方法

这是因为:如果从数据库中包含与即时加载相关的对象,则需要在原始查询中使用它

解决方案很简单:只需使用包括:

这是因为:如果要从数据库中包含相关对象,则需要在原始查询中使用它

解决方案很简单:只需使用包括:


如何在原始查询中使用to_json?抱歉-to_json方法仍然使用原始的arg::include=>:memsfull行,这不会产生重复的查询-快85%!查看最末端:Line.includes:mems.wherelines.document_id=?和lines.text'root'和mems.review_after<?,params[:id],Time.now.to_json:include=>:mems@joshs这比不使用:include on to_json要快85%?`使用Line.include而不是Line.joins时要快85%。无论使用Line.includes还是Line.joins,to_json都需要参数:include=>:mems for mems作为json字符串的一部分。我如何在原始查询中使用to_json?heh抱歉-to_json方法仍然使用原始arg::include=>:memsfull行,这不会产生重复的查询-快85%!查看最末端:Line.includes:mems.wherelines.document_id=?和lines.text'root'和mems.review_after<?,params[:id],Time.now.to_json:include=>:mems@joshs这比不使用:include on to_json要快85%?`使用Line.include而不是Line.joins时要快85%。无论使用Line.includes还是Line.joins,to_json都需要参数:include=>:mems for mems作为json字符串的一部分。
@lines = Line.includes(:mems)\
         .where("lines.document_id = ?
                 AND lines.text <> 'root'
                 AND mems.review_after < ?", params[:id], Time.now())\
         .to_json :include => :mems