【问题标题】:Sort ruby array by updated_at按 updated_at 对 ruby​​ 数组进行排序
【发布时间】:2009-07-23 12:12:02
【问题描述】:

我想做的就是从我的模型中获取最新的项目,然后 将它们放在一个数组中,按属性“updated_at”排序(最新鲜的项目优先)。

某处出错,但我找不到:

  @results = Array.new
  Note.find(:all, :limit => 3, :order => "created_at DESC").each do |item|
      @results << item
  end

  Picture.find(:all, :limit => 3, :order => "created_at DESC").each do |item|
    @results << item
  end


  @results = @results.sort_by{ |result| result.updated_at}

【问题讨论】:

    标签: ruby-on-rails ruby arrays model sorting


    【解决方案1】:

    您需要在排序中进行比较。 `

      @results = Array.new
      Note.find(:all, :limit => 3, :order => "created_at DESC").each do |item|
          @results << item
      end
    
      Picture.find(:all, :limit => 3, :order => "created_at DESC").each do |item|
        @results << item
      end
      @results.sort!{|a,b|a.updated_at <=> b.updated_at}
    

    这将对@results 数组进行就地排序。

    【讨论】:

      【解决方案2】:
      notes    = Note.find    :all, :limit => 3, :order => "created_at DESC"
      pictures = Picture.find :all, :limit => 3, :order => "created_at DESC"
      @results = (notes + pictures).sort_by(&:updated_at)
      

      【讨论】:

        【解决方案3】:

        也许不那么简洁或可读,但它有点干燥。我无法说服自己这比 weppos 的答案更好。我喜欢用“Class.all”替换“Class.find :all”。

        results = [Note, Picture].inject([]) do |memo, clazz|
          memo + clazz.all(:limit => 3, :order => "created_at DESC")
        end
        results = results.sorted_by(&:updated_at)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-05
          • 2016-09-03
          • 2019-06-30
          • 2012-10-24
          • 2011-02-08
          • 1970-01-01
          • 2011-05-07
          • 1970-01-01
          相关资源
          最近更新 更多