Rails 3. Как по умолчанию сортировать по виртуальному атрибуту? - PullRequest
1 голос
/ 17 января 2012

у меня посылки есть один счет; и счет относится к отгрузке. Отгрузка имеет атрибут reference_number.

Я использую activeadmin, и я перечисляю грузы, отсортированные по номеру file_number на странице индекса, как это ...

shipment.rb
default_scope :order => :file_number

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

invoice.rb
def reference_number
  if self.shipment.nil?
    a = "no ref"
  else
    self.shipment.file_number
  end
end

Ответы [ 2 ]

1 голос
/ 18 января 2012

Я могу предложить вам странный метод, первый рефакториал

invoice.rb
def reference_number
  self.shipment.nil? ? "no ref" : self.shipment.file_number
end

def <=> (obj2)
  self.reference_number <=> obj2.reference_number
end
def < (obj2)
  self.reference_number < obj2.reference_number
end
def > (obj2)
  self.reference_number > obj2.reference_number
end
def == (obj2)
  self.reference_number = obj2.reference_number
end

и все! При заполнении представления вы должны включить (отсортировать):

@invoices= Invoice.all.sort
1 голос
/ 17 января 2012
default_scope includes(:shipment).order("shipments.file_number")

В этом случае, очевидно, все nils будут упорядочены вместе, так что вы можете добавить логику для строки "no ref" в представлении когда shipment.blank? или просто придерживайтесь метода reference_number в представлении.

...