2011-08-23 17 views
5

Questo potrebbe essere un allungamento molto lungo, ma renderebbe la vita un po 'più facile se esistesse.Equivalente matrice ruby ​​di record.where attivo (criteri)

Ecco lo scenario in ogni caso. Ho una serie di hash con una chiave il cui valore è un altro hash ........ Sì, lo so.

Heres una spiegazione migliore:

@myArrayOfStuff[0] 
@myArrayOfStuff[0]["single-key"] 
@myArrayOfStuff[0]["single-key"]["object-identifier"] 

La prima restituisce un hash. Il secondo restituirebbe un oggetto (chiamato pagina nel mio caso ma l'esempio usa nomi diversi) Il terzo restituisce qualunque variabile abbia riferimento come identificatore di oggetto.

Abbastanza semplice.

Quello che mi piacerebbe fare è selezionare un altro array in cui il valore degli identificatori di oggetto non è nullo o è maggiore di x. Qualcosa di simile al metodo activerecord.where.

@x = @myArrayOfStuff.where(["single-key"]["object-identifier"]) > 3orwhatever 

Ovviamente questo non funziona in quanto la sintassi è allettante. Ma c'è un altro modo di affrontarlo? Un altro percorso da provare potrebbe essere quello di ordinare l'array con questa variabile. Qualcosa come

@x = @myArrayOfStuff.sort {|x,y| y <=> x } 

Tuttavia non capisco davvero che cosa sta succedendo con il metodo di ordinamento di Ruby. Qualcuno può aiutare?

+0

http://stackoverflow.com/questions/2637419/understanding-ruby-array-sort la lettura di questo ora, ma ancora non è sicuro se si applica a quello che sto cercando di fare – overtone

risposta

13

È possibile utilizzare il metodo select.

@x = @my_array_of_stuff.select {|v| v["single-key"]["object-identifier"] > 3} 
+0

Eccellente! Capisco tutto lì – overtone

0
collection = [ 
    {a:1, b:2, c:3}, 
    {a:2, b:3, c:4} 
] 
where = {a:1} 
collection.select{|item| 
    where.map{|k,v| 
    item[k] == v ? true : nil 
    }.compact.length == where.length 
} 
+1

Mentre le risposte solo in codice non sono vietate, ti preghiamo di capire che si tratta di una community di domande e risposte, piuttosto che di crowdsourcing, e che, di solito, se l'OP ha capito che il codice è stato inviato come risposta,/lei avrebbe escogitato una soluzione simile da sola e non avrebbe pubblicato una domanda in primo luogo. Lo stesso principio si applica anche ai futuri lettori che potrebbero non avere familiarità con il codice presentato. Pertanto, fornisci il contesto alla tua risposta e/o al codice spiegando * come * e/o * perché * funziona. – XenoRo