2012-01-18 12 views
13

Estoy tratando de usar YAML para crear una lista de todos los procs almacenados utilizados en una aplicación y desde donde se llaman. Imaginé algo como a continuación, pero creo que YAML no permite el anidamiento de múltiples niveles.Anidamiento de múltiples niveles en YAML

access_log: 
    stored_proc: getsomething 
    uses: 
     usedin: some->bread->crumb 
     usedin: something else here 
    stored_proc: anothersp 
    uses: 
     usedin: blahblah 

reporting: 
    stored_proc: reportingsp 
    uses: 
     usedin: breadcrumb 

¿Hay alguna manera de hacer esto en YAML? Si no, ¿qué otras alternativas hay?

Respuesta

13

Así es exactamente como he usado niveles anidados en YAML para archivos de configuración para scripts Perl. This YAML Tutorial podría ser una buena referencia para usted sobre cómo manejar la estructura que desea en Ruby.

Creo que su problema está tratando de mezclar tipos. Sugiero revisar la siguiente manera:

reporting: 
    stored_procs: 
    reportingsp 
     uses: 
     usedin: breadcrumb 
    secondProc 
     uses: 
     usedin: something_else 
+0

hmm ese tutorial no muestra anidación profunda. Si cargo el yaml estructurado anterior en mi script ruby, me da un error al cargar el archivo yaml. – Anthony

+0

Definitivamente he usado varios niveles de anidación. Lo que noto, que no he hecho, es que tienes una mezcla de cosas. p.ej. stored_proc con un valor y más anidado debajo. Ese puede ser el problema. – Ilion

+0

sí, ese es el problema. Quiero una anidación profunda para que todo se alinee. Supongo que no es posible con yaml – Anthony

13

Como señaló @Ilion, no se puede tener una propiedad que apunta tanto a una cadena y un objeto; necesitarías una matriz o una etiqueta para tus nombres de storage_proc. Además, sigues corriendo sobre tus llaves usando el mismo nombre, cuando lo que realmente quieres es una matriz. He aquí un ejemplo simple y prueba de que funciona:

MY_YAML = " 
access_log: 
    - 
    name: getsomething 
    uses: 
     - some->bread 
     - something else here 
    - 
    name: anothersp 
    uses: 
     - blahblah" 

require 'yaml' 
require 'pp' 
pp YAML.load(MY_YAML) 
#=> {"access_log"=>[ 
#=> {"name"=>"get something", "uses"=>["some->bread", "something else here"]}, 
#=> {"name"=>"anothersp", "uses"=>["blahblah"]} 
#=> ]} 
-3
--- 
access_log: 
    - stored_proc: getsomething  
    - uses:  
    - usedin: some->bread->crumb  
    - usedin: something else here 
    - stored_proc: anothersp  
    - uses:  
    - usedin: blahblah 
reporting: 
    - stored_proc: reportingsp  
    - uses:  
    - usedin: breadcrumb 
+0

¿Por qué se negó para que todos podamos aprender? –

+4

@Brian evita la imposibilidad de tener varias claves de diccionario con el mismo nombre al reemplazar cada elemento del diccionario con una lista de elementos individuales que contiene un diccionario de elemento único. Hace la estructura muy profunda y bastante peculiar. Intenta pegarlo en http://www.yamllint.com/ o en algún lugar y verás más claramente cómo es realmente la estructura. – Godsmith

Cuestiones relacionadas