Rails 3.如何默认按虚拟属性排序?

时间:2012-01-17 18:09:41

标签: ruby-on-rails ruby activerecord activeadmin

我发货有一张发票;和发票属于发货。 货件具有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 个答案:

答案 0 :(得分:1)

default_scope includes(:shipment).order("shipments.file_number")

在这种情况下,显然所有的nils都将一起订购,因此您可以在shipment.blank中为视图中的“no ref”字符串添加逻辑?或者只是在视图中坚持使用reference_number方法。

答案 1 :(得分:1)

我可以向你推荐一种奇怪的方法,第一次重构

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