Ruby复杂数据结构交集通配符

时间:2014-07-14 18:12:58

标签: ruby

以下是单个XML记录的示例;每条记录中可能有1个&n个N个字段,<root> ... </root>内有许多记录。

我有一个生成每个条目的模板,我想重新使用该模板来执行查找(为了DRY的利益)。我想我可以采用一个空模板,用某种通配符填充它,然后在填充的模板和数据库之间执行交集(&&)。目前我有一个多行find_all...each do的查找例程,它可能与生成模板不同步,这不是很好!

require 'xmlsimple'

xml = Q%(
<root>
  <location>
    <name>San Jose</name>
    <trips>
      <trip>
        <date>April 1, 2014</date>
        <person>
          <pname>Bob</pname>
          <cost>500.00</cost>
          <days>3</days>
        </person>
        <person>
          <pname>Alice</pname>
          <cost>30.00</cost>
          <days>1</days>
        </person>
      </trip>
    </trips>
  </location>
  <location>
    <name>Florida</name>
    <trips>
      <trip>
        <date>April 20, 2014</date>
        <person>
          <pname>Alice</pname>
          <cost>300.00</cost>
          <days>3</days>
        </person>
      </trip>
      <trip>
        <date>May 1, 2014</date>
        <person>
          <pname>Alice</pname>
          <cost>500.00</cost>
          <days>4</days>
        </person>
      </trip>
    </trips>
  </location>
</root>

>> db_hash = XmlSimple.xml_in(xml)
=> {"location"=>[{"name"=>["San Jose"], "trips"=>[{"trip"=>[{"date"=>["April 1, 2014"], "person"=>[{"pname"=>["Bob"], "cost"=>["500.00"], "days"=>["3"]}, {"pname"=>["Alice"], "cost"=>["30.00"], "days"=>["1"]}]}]}]}, {"name"=>["Florida"], "trips"=>[{"trip"=>[{"date"=>["April 20, 2014"], "person"=>[{"pname"=>["Alice"], "cost"=>["300.00"], "days"=>["3"]}]}, {"date"=>["May 1, 2014"], "person"=>[{"pname"=>["Alice"], "cost"=>["500.00"], "days"=>["4"]}]}]}]}]}

我想做(逻辑上)这样的事情:

>> match_hash = XmlSimple.xml_in(template)
=> {"location"=>[{"name"=>["*"], "trips"=>[{"trip"=>[{"date"=>["*"], "person"=>[{"pname"=>["Bob"], "cost"=>["*"], "days"=>["*"]}]}]}]}]}
>> result = db_hash && match_hash
=> {"location"=>[{"name"=>["San Jose"], "trips"=>[{"trip"=>["April 1, 2014"], "person"=>[{"pname"=>["Bob"], "cost"=>["500.00"], "days"=>["3"]}]}]}]}

使用&&时是否可以使用通配符?

有没有办法在不指定每个哈希键名的情况下执行此操作?

目标是拥有一个描述数据结构组织的单一来源,并将其用于读写。我在创建新条目时eval创建了一个模板,这可用于创建上面的template

1 个答案:

答案 0 :(得分:1)

您可以使用模板引擎。 Liquid似乎很合适,因为它可以将ActiveRecord查询合并到模板中。

另一种选择是使用XML本身作为模板。一个简单的Nokogiri脚本可以用文本替换通配符。