【问题标题】:Preload Model Associations On Find在查找时预加载模型关联
【发布时间】:2009-01-27 06:18:47
【问题描述】:

现在我正在尝试调用我的模型,并将其结果吐出为 json/xml 格式。我唯一的问题是,我的数据库关联没有被加载或查询。

通常,我可以运行这个

@campaign = Campaign.find(:all)

然后通过调用@campaign[0].hitshas_many :hits 获取点击数。

但是如果你调试输出,它只会调用表上的列。您将如何将其与您的查询放在一起?

例如:

网站2009-01-24 14:49:02 -08002009-01-24141c5334415da5c89384e42ce6d72609dda2009-01-245广告系列>

然后让它添加另一列,但没有点击次数。

网站2009-01-24 14:49:02 -08002009-01-24141c5334415da5c89384e42ce6d72609dda2009-01-245123412广告系列>

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    ActiveRecord find() 系列采用 :include 选项,可让您预先加载关联。

    所以你需要做的就是:

    @campaign = Campaign.find(:all, :include => :hits)

    以上将急切加载您的数据库调用,以便访问每个索引 [0]。 [1] 等不会发出自己的 SELECT 调用。当你打电话时

    @campaign[0].to_json

    那么它不会包含任何关联,例如“命中”来做到这一点,那么您还需要:在 to_json 调用中包含它,例如

    @campaign[0].to_json(:include => :hits)

    【讨论】:

    • 这符合我的要求,但是是否可以不返回行,而只计算它们并返回整数?
    • 是的。 ActiveRecord 返回一个 AssociationProxy(它的作用类似于一个数组,但具有更多的超能力)。它具有的一种方法是“size()”。所以你可以做 @campaign = Campaign.find(:all, :include => :hits) @campaign.each 做 |cpg|将“点击数:#{cpg.hits.size}”结束
    • AssocationProxy 有“count”、“size”和“length”,在这里介绍:rhnh.net/2007/09/26/…
    • 但是您不能添加 to_json 或 to_xml 对吗?由于这不是将其添加为数组。也许更好的问题是,如何进行另一个查询并将其作为新列放入。就像自定义方法一样。
    • @Garrett to_json 只是 ActiveRecord::Base 所有成员上的一个方法,因此您可以根据需要覆盖它。
    【解决方案2】:

    您可以通过在您的广告系列模型中添加 hits_count 字段来实现您想要的。这将在添加新关联时自动更新。

    查看 ActiveRecord Associations 文档中的 counter_cache

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多