【问题标题】:How would you join two records that belong_to the same record without an N+1?如果没有 N+1,您将如何连接属于同一记录的两条记录?
【发布时间】:2012-02-03 20:26:42
【问题描述】:

我有一个应用程序,企业可以在该应用程序中报税和申请延期纳税。 (扩展是说“我需要更多时间来归档”的请求。)

我有以下关系:

Business has_many :tax_filings (one per year)
TaxFiling belongs_to :business

Business has_many :tax_extensions (one per year)
TaxExtension belongs_to :business

当我显示税务申报清单时,我希望每个申报都显示是否有相应的扩展名。但是如果没有 N+1 查询,我不确定如何做到这一点。

现在我在 TaxFiling 上有这个方法:

def extension
  TaxExtension.where(:business_id => business_id, :year => year).first
end

所以每次我调用TaxFiling#extension,它都会进行另一个数据库查询。

我在business_idyear 上为TaxFiling 添加了joins 扩展的范围,但我不确定如何让TaxFiling#extension 在两个模型之间没有声明关系的情况下使用它。

我该怎么做?

【问题讨论】:

  • 也许很明显,有人会用joins 查询列表和扩展名的企业,然后从那里开始。但不幸的是,列表和扩展可能属于不同的用户,他们都不能拥有该业务。所以这在这里行不通。
  • 我不确定,用户与这些有什么关系?
  • @SergioTulentsev - 是的,也许这比有用更令人困惑。我只是想解释为什么我不这样做 business.tax_filingbusiness.tax_extension 而是必须从归档遍历到扩展名是有一个特定于应用程序的原因。

标签: ruby-on-rails activerecord ruby-on-rails-3.1


【解决方案1】:

我认为您想要的是 .includes 方法,以便在您最初加载 TaxFiling 模型时进行预加载。如果你这样做:

TaxFiling.includes(:business => [:tax_extensions])

Rails 将使用三个查询(每个模型一个)将关联的业务和扩展加载到内存中,而不是 N 个查询。

【讨论】:

  • 这看起来像我想要的。是否可以以某种方式在tax_extensions 上加上where,以确保它与提交文件的年份相同?
  • 当然。一旦你像这样使用了.includes,你可以参考包含的模型,就像你加入它们一样,所以你可以在那里添加.where('tax_extensions.year = tax_filings.year')
猜你喜欢
  • 2016-02-06
  • 2022-01-18
  • 2015-06-22
  • 1970-01-01
  • 2023-03-28
  • 2015-07-02
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多