以下是单个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
。
答案 0 :(得分:1)
您可以使用模板引擎。 Liquid似乎很合适,因为它可以将ActiveRecord查询合并到模板中。
另一种选择是使用XML本身作为模板。一个简单的Nokogiri脚本可以用文本替换通配符。