【问题标题】:Rails 5: JS treeview from hash of datesRails 5:来自日期哈希的 JS 树视图
【发布时间】:2017-05-22 16:25:05
【问题描述】:

我有一个模型,可以找到不同的日期,然后按年、月、日对值进行分组:

def self.tree
  dates = MyModel.order("date_trunc('day', datetime_column) DESC")
           .distinct.pluck("date_trunc('day', datetime_column)")
  hash = Hash.new { |h, y| h[y] = Hash.new { |h2, m| h2[m] = {} } }
  dates_by_ymd = dates.each_with_object(hash) do |date, h|
    h[date.year][date.strftime('%B')][date.strftime('%b %d')] = date
  end
end

在查看此哈希时打印出来:

{2016=>{"November"=>{"Nov 20"=>Sun, 20 Nov 2016 05:20:00 UTC +00:00}, "December"=>{"Dec 12"=>Mon, 12 Dec 2016 04:05:00 UTC +00:00, "Dec 24"=>Sat, 24 Dec 2016 18:51:33 UTC +00:00, "Dec 30"=>Fri, 30 Dec 2016 06:20:00 UTC +00:00}}, 2017=>{"December"=>{"Dec 12"=>Tue, 12 Dec 2017 15:15:00 UTC +00:00}}}

在控制器中我有这个:

def update_placements
  @placements = #code which finds placements
  @treeview = @placements.tree
  respond_to do |format|
    format.js
  end
end

如何将上面的 hash 变成一些漂亮的 javascript 树视图? 对于example like here

如果有任何提示,我将不胜感激。谢谢!

加法

此外,我还需要能够获取特定日期的记录。基本上它会打开年、月、日,然后填充特定日期的记录。我正在考虑一起加载年、月、日,然后每天分别加载记录,因为表可能会变得很大。当天的记录可以找到购买datetime_column

更新

在视图中有这个填充树视图的代码:

<div id="tree">
    <script>
       $('#tree').jstree({
           'core' : {
               'data' : [ <%= raw @treeview %> ]
              }
          });
    </script>
</div>

请问如何将年份(在下面的示例中为 2017 年、2016 年)设为根节点?我想摆脱“根”。

data 的 JS 像这样:

$('#tree').jstree({
    'core' : {
        'data' : [ { 'text' : 'Child 1' }, 'Child 2' ]
         }
});

会像这样摆脱“节点”:

在“儿童 1”、“儿童 2”... 我需要填充我的 2016、2017 等。上面 JS 中的“文本”是您代码中的“数据”。

【问题讨论】:

  • 你知道 JSON 应该是什么样子吗?
  • @EricDuminil 这里是例子 - jstree.com/docs/json 我想最简单的 JSON 版本就可以了,因为没有太多数据要加载(几千个项目)。
  • @EricDuminil 关于树的数量,最后我需要能够加载与特定日期相关的记录(我会为此单独查询)。可能AJAX option from here 是他们要走的路。

标签: javascript ruby-on-rails arrays json ruby


【解决方案1】:

一旦你有dates_ymd

{2017=>
  {1=>
    {8=>#<Date: 2017-01-08 ((2457762j,0s,0n),+0s,2299161j)>,
     3=>#<Date: 2017-01-03 ((2457757j,0s,0n),+0s,2299161j)>}},
 2015=>
  {12=>{5=>#<Date: 2015-12-05 ((2457362j,0s,0n),+0s,2299161j)>},
   11=>{7=>#<Date: 2015-11-07 ((2457334j,0s,0n),+0s,2299161j)>}}}

你可以用这个方法:

def to_js_tree(hash = tree, node = :root)
  hash.each_with_object({data: node}){|(k,v), new_hash|
    new_hash[:children] ||= []
    if v.is_a?(Hash)
      new_hash[:children] << to_js_tree(v,k)
    else
      new_hash[:children] << {data: k, :children => [{data: v}]}
    end
  }
end

例子:

pp to_js_tree(dates_by_ymd)
# =>
{:data=>:root,
 :children=>
  [{:data=>2017,
    :children=>
     [{:data=>1,
       :children=>
        [{:data=>8,
          :children=>
           [{:data=>#<Date: 2017-01-08 ((2457762j,0s,0n),+0s,2299161j)>}]},
         {:data=>3,
          :children=>
           [{:data=>#<Date: 2017-01-03 ((2457757j,0s,0n),+0s,2299161j)>}]}]}]},
   {:data=>2015,
    :children=>
     [{:data=>12,
       :children=>
        [{:data=>5,
          :children=>
           [{:data=>#<Date: 2015-12-05 ((2457362j,0s,0n),+0s,2299161j)>}]}]},
      {:data=>11,
       :children=>
        [{:data=>7,
          :children=>
           [{:data=>
              #<Date: 2015-11-07 ((2457334j,0s,0n),+0s,2299161j)>}]}]}]}]}

puts to_js_tree(dates_by_ymd).to_json
#=> {"data":"root","children":[{"data":2017,"children":[{"data":1,"children":[{"data":8,"children":[{"data":"2017-01-08"}]},{"data":3,"children":[{"data":"2017-01-03"}]}]}]},{"data":2015,"children":[{"data":12,"children":[{"data":5,"children":[{"data":"2015-12-05"}]}]},{"data":11,"children":[{"data":7,"children":[{"data":"2015-11-07"}]}]}]}]}

在你的情况下,你可以打电话:

@placements.to_js_tree.to_json

如果你已经定义了

def self.to_js_tree(hash = tree, node = :root)

在您的展示位置模型中。

更新

如果您不想要一个以年为子节点的根节点,而是一个以多棵树和年为根的数组,您可以添加一个新的to_js_trees 方法:

def to_js_trees(hash = tree)
  hash.map{|year, year_tree|
    to_js_tree(year_tree, year)
  }
end

注意:@treeview 现在已经是一个数组,所以你可以使用'data' : &lt;%= raw @treeview %&gt; 而不是'data' : [ &lt;%= raw @treeview %&gt; ]

【讨论】:

  • 谢谢!我已经将方法放在模型中,然后在控制器中 puts @placements.to_js_tree(dates_by_ymd).to_json 但它给了我错误 undefined local variable or method dates_by_ymd'` 请问我做错了什么?
  • 像魅力一样工作:)
  • 你能检查我上面的更新吗?我想将树视图中的填充年份作为根,但不知道如何。
  • 我不知道。一个jstree可以有多个根吗?您需要多个 jstrees 多年作为根。我去看看。
  • 是的,可以。请参阅上面的我的 JS 代码更新。抱歉,我之前没有检查。
猜你喜欢
  • 2015-08-09
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-12
相关资源
最近更新 更多