如何在将哈希值打印到表格内的pdf之前对哈希值进行排序

时间:2009-06-18 11:09:10

标签: ruby

我有一个名为个人用户的动作每页pdf,它与两个模型进行通信,用户模型从数据库中检索信息,但仅针对所有用户的特定信息,然后获取信息并将其发送到模型报告然后,当我检查每个用户的属性时,它以我没有从模型用户调用它的方式显示,它采用每一对并以不同的顺序放置它,所以当我在pdf上写一个表的信息时它显示它很糟糕,像首字母可能是我的表的最后一条记录,手机可能是第一个...我必须为每个用户的信息创建一个新的页面..

我的报告代码看起来像:

  

def self.generate_individual_pdf(人,居民,用户,遗产=无,标题=无)

pdf = PDF::Writer.new
title = !title ? "Report" :title
pdf.select_font "Times-Roman"
pdf.text "<em>Compiled By: #{user.presentation_name}</em> <em>Estate: #{estate.name}</em>                                       <em>Created On: #{Time.now.strftime('%d/%m/%Y %H:%M')}</em>", :justification => :center
   x = 0
25.times do
  pdf.text ""+"                        "
  x+=1
  puts x
end
pdf.text "<em>User Report For: #{estate.name}</em> ", :font_size => 18, :bold => true, :justification => :center
if estate.logo
  pdf.image "#{RAILS_ROOT}/public"+estate.logo.public_filename,:width => 100, :height => 100, :resize => 1.1, :justification => :center
end
y = 0
#loop people to create table for every person
 people.each do |p| 
  pdf.start_new_page 
  pdf.text"                   "+p.Title.to_s+"  "+p.Firstname.to_s+"  "+p.Lastname.to_s, :font_size => 12, :justification => :center
  pdf.text ""+"                        "
  pdf.text ""+"                        "
  pdf.text "Please verify if your details below are correct, and rectify them in the third column of the table.", :font_size => 8
  pdf.text ""+"                        "
  table = PDF::SimpleTable.new
  table.column_order.push(*["head1","head2","head3"])
  headings = ["head1","head2","head3"]
  headings.each do |h|
    table.columns[h] = PDF::SimpleTable::Column.new(h)
    table.columns[h].heading = h.humanize
  end
  #display tables
   table.show_headings = false
   table.orientation = :right
   table.position = :left
   data = []
    p.attributes.each_pair do |h|
     data << { "head1" => h[0], "head2" => h[1], "head3" => "                                "}
   end


   table.data.replace data
   table.render_on(pdf)

     i = 0
   28.times do
    pdf.text ""+"                        "
    i+=1
    puts i 
  end
  pdf.text "Kind Regards"+ "                   "+p.Title.to_s+"  "+p.Firstname.to_s+"  "+p.Lastname.to_s, :font_size => 11
  pdf.text ""+"                        "
  pdf.text "Signature                          "+"......................................."

end

然后它在p.attribute.each_pair do | h |循环时产生输出   数据&lt;&lt; {“head1”=&gt; h [0],“head2”=&gt; h [1],“head3”=&gt; “这应该是零”} 端

请伙计们,我一直在尝试使用所有这些排序但我无法得到正确的答案。任何人都可以提供帮助请感到自由..提前感谢。

2 个答案:

答案 0 :(得分:0)

红宝石中的哈希本质上是无序的物体。您无法保证按照您输入的顺序从中获取数据。

听起来这些属性对以随机顺序出现(或者至少不是你想要的顺序)。解决这个问题的一种可能方法是......

p.attributes.keys.sort do |key|
  data << { "head1" => key, "head2" => p.attributes[key], "head3" => nil }
end

这将返回按值名称

按字母顺序排序的所有属性

答案 1 :(得分:0)

Ruby 1.9将包含有序哈希,但是如果你是1.8,那么看看ruby facets中的字典类。 (http://facets.rubyforge.org/doc/api/more/classes/Dictionary.html

这帮助我在过去做到这一点。