首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >to_json :包含在活动记录中需要数据库

to_json :包含在活动记录中需要数据库
EN

Stack Overflow用户
提问于 2011-01-10 12:38:02
回答 1查看 791关注 0票数 1

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

代码语言:javascript
复制
@lines = Line.joins(:mems)\
             .where("     lines.document_id = ?
                      AND lines.text <> 'root'
                      AND mems.review_after < ?", params[:id], Time.now())\
             .to_json :include => :mems

我的开发日志如下:

代码语言:javascript
复制
  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方法会针对每条Line记录分别查询关联的模型。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-10 12:41:22

这是因为:include eager从数据库加载相关对象,所以您需要在原始查询中使用它。

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

代码语言:javascript
复制
@lines = Line.includes(:mems)\
         .where("lines.document_id = ?
                 AND lines.text <> 'root'
                 AND mems.review_after < ?", params[:id], Time.now())\
         .to_json :include => :mems
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4643718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档