【问题标题】:Rails 3. How to default sort by a virtual attribute?Rails 3. 如何默认按虚拟属性排序?
【发布时间】:2012-01-18 05:46:29
【问题描述】:

我的货物有一张发票;发票属于发货。 Shipment 具有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

【问题讨论】:

  • 您可以在应用程序中进行排序。
  • 如果我这样做link_to invoice.reference_number, admin_invoice_path(invoice) 我得到一个没有这样的列:invoice.reference_number 错误
  • 你在添加这个 meod 后重启了你的服务器吗?当您的应用程序已经处于开发阶段并且问题出在另一个地方时,这很重要......

标签: ruby-on-rails ruby activerecord activeadmin


【解决方案1】:
default_scope includes(:shipment).order("shipments.file_number")

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

【讨论】:

    【解决方案2】:

    我可以给你推荐一个奇怪的方法,先重构

    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
    

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2012-03-29
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多