在 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
请注意,这是有效的,因为这两种类型(articles
和 ideas
)具有相同的属性并且以相同的方式呈现为 RSS。
我正在将多个项目合并到一个 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
请注意,这是有效的,因为这两种类型(articles
和 ideas
)具有相同的属性并且以相同的方式呈现为 RSS。