【问题标题】:to_json :include on active record requires databaseto_json :包含在活动记录上需要数据库
【发布时间】:2011-01-10 04:38:01
【问题描述】:

我想生成一个具有一级关联的 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 方法会单独查询每个 Line 记录的关联模型。

有没有办法在不编写自定义序列化方法的情况下避免这些重复查询?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

    解决方法很简单:使用includes:

    @lines = Line.includes(:mems)\
             .where("lines.document_id = ?
                     AND lines.text <> 'root'
                     AND mems.review_after < ?", params[:id], Time.now())\
             .to_json :include => :mems
    

    【讨论】:

    • 如何在原始查询中使用 to_json?
    • 嘿抱歉 - to_json 方法仍然采用原始 arg: :include => :mems
    • 整行,不会产生重复的查询——快了 85%!查看最后: Line.includes(:mems).where("lines.document_id = ? AND lines.text 'root' AND mems.review_after :mems
    • @joshs 这比在to_json 上没有:include 快​​85%?`
    • 使用 Line.includes 而不是 Line.joins 时快 85%。无论您使用 Line.includes 还是 Line.joins,to_json 都需要参数 :include => :mems 以使 mems 成为 json 字符串的一部分。
    猜你喜欢
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2012-11-30
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多