与ROR Active Record中的急切加载结果相关

时间:2011-09-29 09:45:29

标签: ruby-on-rails activerecord eager-loading

我有一个属于客户的发票模型(当然还有客户发货的发票)。

如果我这样做:

{
  @invs = Invoice.find(
    :all, 
    :include => ["customer"], 
    :conditions => ['somecondition']
  )
}

@invs类是一个数组,我可以看到数组中第6张发票的所有属性:@invs[5]。但是,此时我没有看到关联的客户记录属性。为此,我需要@invs[5].customer

我的问题是什么是允许从发票记录访问客户记录的Ruby结构?我想创建一个新的SomeClass任意记录,并将其附加到记录集中的发票记录,以便我可以@inv[5].someclass。那可能吗?如果是这样的话?

[编辑 - 全文] 以下试图解释我为什么问这个问题。

虽然我的发票模型与Db中的单个表有关,但我的客户记录可以归档并移动到另一个名为Archcustomer的表中,该表与结构中的Customer相同。所以我还有其他的关联,例如Invoice belongs_to Archcustomer和Archcustomer has_many Invoices。

我需要获取发票清单及其相关客户记录(无论其位于何处,即客户或Archcustomer),但按Customer.category_id和Customer.id以及Invoice.id排序。

在我上面的@invs的原始示例中,我包括客户记录,我可以包括:order => 'customer.category_id,customer.id,invoice.id'子句但客户归档的地方客户记录为零。

所以我想我会做以下事情:

{
  @invs.each do |inv|
    next if inv.customer != nil
    archcust = Archcustomer.find(inv.customer_id) #since it's not in customer get it from Archcustomer
    inv.customer.category_id = archcust.category_id 
    etc...
    ...
    end
}

然后使用@ inv.sort_by。然而,这是抱怨,因为我正在尝试为Nil类的customer.category_id分配一个值。

那时我想如果我可以将任意记录附加到Invoice,我可以从Archcustomer或Customer填写信息,并有一组共同的属性来调用我的sort_by。

当然,如果有其他方式可以按照我的要求订购我的发票组,那么我会很乐意接受它。

1 个答案:

答案 0 :(得分:2)

在您的发票模型中(假设您已建立Archcustomer关系):

class Invoice < ActiveRecord::Base
  def customer_record
    customer or archcustomer
  end
end

当您需要从任何可用来源获取记录时,请使用@invoice.customer_record代替@invoice.customer@invoice.archcustomer。当你加载时.include

当您已经拥有真实的Customer时,不要费心将内容分配给虚构的Archcustomer。只需在sort_by上运行customer_record.category_id