在 Ruby 中按日期对 RSS 项目排序

Sort RSS items by date in Ruby

我正在将多个项目合并到一个 RSS 文件中,像这样迭代它们:

# create RSS
atom = RSS::Maker.make('atom') do |f|
  f.channel.updated = Date.today.to_s

  # iterate through Ideas
  ideas[0,50].each do |r|
    f.items.new_item do |e|
      e.updated = DateTime.parse(r[:date].to_s).to_s
      e.title = r[:title]
      e.content.type = 'html'
    end
  end

  # iterate through Articles
  articles[0,50].each do |r|
    f.items.new_item do |e|
      e.updated = DateTime.parse(r[:date].to_s).to_s
      e.title = r[:title]
      e.content.type = 'html'
    end
  end
end

但是文件中项目的顺序不是按日期排序的(因为我循环遍历了第一批“想法”,然后是“文章”)

我在迭代后尝试按 date / updated 值排序,具有以下组合:

  # f.items.sort {|a,b| a.updated <=> b.updated}
  # atom.items.sort! {|a,b| a.date <=> b.date}
  # f.items.reverse!
  # f.items.sort_by(&:date)
  # f.sort_by(&:date)

但是没有成功。

我是否需要再次循环遍历 RSS 中的每个项目以对它们进行排序?

我会将两个数组组合成一个 items 数组,然后在迭代之前对那个数组进行排序:

atom = RSS::Maker.make('atom') do |f|
  f.channel.updated = Date.today.to_s

  items = ideas.first(50) + articles.first(50)
  items = items.sort_by { |item| item[:date] }

  # iterate through all items
  items.each do |r|
    f.items.new_item do |e|
      e.updated = DateTime.parse(r[:date].to_s).to_s
      e.title = r[:title]
      e.content.type = 'html'
    end
  end
end

请注意,这是有效的,因为这两种类型(articlesideas)具有相同的属性并且以相同的方式呈现为 RSS。