【问题标题】:Dashing - lists widgetDashing - 列表小部件
【发布时间】:2025-11-24 19:30:02
【问题描述】:

我在 dashing 中使用“列表”小部件来显示一个字符串和一个值(在本例中是用户名和批处理系统上运行的作业数)。

我希望按值(作业数)降序排列显示。它目前从包含字符串(用户名)和值(作业数)的 csv 文件中读取这些,按降序排列。

CSV.foreach('/path/to/file.csv') do |row|
    user = row[0]
    numberOfJobs = row[1]
    SGE_list[user] =  { label: user, value: numberOfJobs }
end

只要 dashing 开始,并第一次读取文件,这是正确的。但是,当它重新读取文件(不断更新)时,它会保持原来的顺序,(不管 csv 文件中的顺序如何)。

有什么建议吗?

完整的作业文件:

require 'csv'

JOB_list = Hash.new({ value: 0 })

SCHEDULER.every '5m' do

  groups = ["user1", "user2", "user3", "user4", "user5", "user6", "user7", "user8"]

  # Read in to get order                                                        
  CSV.foreach('/opt/dashing/sweet_dashboard_project/jobs/qusage.csv') do |row|
    user = row[0]
    numberOfJobs = row[1]
    JOB_list[user] =  { label: user, value: numberOfJobs }
  end

  # blank all values                                                            
  for g in groups
    JOB_list[g] =  { label: g, value: 0 }
  end

  CSV.foreach('/opt/dashing/sweet_dashboard_project/jobs/qusage.csv') do |row|
    user = row[0]
    numberOfJobs = row[1]
    JOB_list[user] =  { label: user, value: numberOfJobs }
  end

  send_event('batch_jobs', { items: JOB_list.values })

end

csv 文件可能会有所不同。它可能是: 用户 7, 1000 用户 2, 987 用户 8, 800 用户 6, 400 用户 5, 200 用户 4, 122 用户 1, 89 用户 3, 2

或者,如果用户没有运行作业,则不会列出它们:

用户 6, 340 用户 5, 123 用户 4, 101

它总是按第二列排序。

【问题讨论】:

  • 更好地在 gist 中提供完整的小部件以供参考 csv 示例文件

标签: dashing


【解决方案1】:

似乎您的哈希顺序已按 [user] 排序“刻录”。

哈希按照插入相应键的顺序枚举它们的值。 http://www.ruby-doc.org/core-2.1.2/Hash.html

因此“清空”这些值并不能解决这个问题。您可以为您的哈希添加一些排序。但是,如果您信任 CSV 中的排序,并且它使用新的 Hash 对象正确加载,为什么不每次运行都重新初始化 Hash?快速简单

require 'csv'


SCHEDULER.every '5m' do

  JOB_list = Hash.new

  # Trust the CSV file to sort by row[1], a.k.a. NumberOfJobs                                                        
  CSV.foreach('/opt/dashing/sweet_dashboard_project/jobs/qusage.csv') do |row|
    user = row[0]
    numberOfJobs = row[1]
    JOB_list[user] =  { label: user, value: numberOfJobs }
  end

  send_event('batch_jobs', { items: JOB_list.values })

end

【讨论】:

    【解决方案2】:

    我建议在重新填充之前删除小部件数据。就在脚本中的 send_event 之前,您可以添加以下行:

    Sinatra::Application.settings.history.delete('batch_jobs')
    

    这将清除您正在使用的小部件哈希,而不会将更新发送到正在使用该小部件的任何仪表板。由于您要立即重新填充它,因此小部件将从中获取更新,然后显示新的(和新排序的)列表。

    它并不优雅,但它应该适合你。

    【讨论】: