Связано с результатом активной загрузки в ROR Active Record - PullRequest
1 голос
/ 29 сентября 2011

У меня есть модель Счета-фактуры, которая принадлежит Заказчику (и, конечно, счета-фактуры Клиента has_many).

Если я сделаю:

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

Класс @invs - это массив, и яможно увидеть все атрибуты для 6-го счета в массиве, если я сделаю: @invs[5].Однако в этот момент я не вижу связанных атрибутов записей о клиентах.Чтобы получить это, мне нужно сделать @invs[5].customer.

. Мой вопрос: что такое структура Ruby, которая позволяет получить доступ к записи клиента из записи счета?Я хочу создать новую произвольную запись SomeClass и прикрепить ее к записи счета-фактуры в наборе записей, чтобы я мог сделать @inv[5].someclass.Это возможно?и если да, то как?

[РЕДАКТИРОВАТЬ - ПОЛНАЯ ИСТОРИЯ] Следующее пытается объяснить, почему я задаю вопрос.

Хотя моя модель счета-фактуры относится к одной таблице в Db my Customerзапись может быть заархивирована и перемещена в другую таблицу с именем Archcustomer, которая идентична структуре Customer.Поэтому у меня есть дополнительные ассоциации, такие как Счет-фактура, принадлежащий Archcustomer и Archcustomer, has_many Счет-фактуры.

Мне нужно получить список счетов-фактур вместе с соответствующей записью клиента (независимо от того, где они хранятся, например, Клиент или Archcustomer), но отсортированы по Заказчику.category_id и Customer.id и Invoice.id.

В моем приведенном выше примере @invs я включил запись клиента и мог бы включить: order => 'customer.category_id, customer.id, счет-фактуру.id ', но если клиент заархивирован, запись клиента равна nil.

Поэтому я подумал, что сделаю следующее:

{
  @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.Однако это жалуется, потому что я пытаюсь выделить значение для customer.category_id класса Nil.

Именно тогда я подумал, что если бы я мог прикрепить произвольную запись к Инвойсу, я мог бы заполнить информацию от Archcustomer или Customer и получить общий набор атрибутов для вызова моего sort_by.

OfКонечно, если есть какой-то другой способ получения моего Счета-фактуры, заказанного так, как я хочу, то я буду счастлив с этим.

1 Ответ

2 голосов
/ 29 сентября 2011

В вашей модели счета-фактуры (при условии, что у вас установлены отношения с 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.

...