Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732

    [Rails] Metodo Find dinamico

    Mi sapreste dire qual'è il modo migliore per creare una query dinamica col metodo Find.

    Mi spiego, se ho una form che permette di fare un ricerca per tot campi e non ne compilo alcuni, voglio, che tali campi vengano ignorati durate la ricerca ovvero che per essi venga restituto l'intero range di valori presenti a DB.

    Es. ho un Model "Posts" con due campi :title e :body

    poi ho una form che mi permetta la ricerca su essi; io voglio che partendo dalla query di base
    codice:
    SELECT * FROM posts WHERE 1
    possa aggiungere "dinamicamente"

    SE :title != ''
    codice:
     AND title = :title
    SE :body != ''
    codice:
     AND body LIKE '%:body%'
    quindi a priori non conosco il numero di campi su cui svolgere la ricerca ma solo dopo il SUBMIT della form.

    Scrivere dunque questo set di istruzioni:
    codice:
    title = params[:query] 
    body = '%' + params[:query] + '%'
        
    @posts = Post.find(:all, :conditions => ["title = ? OR body like ?",title,body])
    mi crea problemi sul come renderla "dinamica".

    Grazie

  2. #2
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    Per ora ho fatto così:

    codice:
       conditions = "" 
    
       unless params[:title].length.zero? 
          conditions += " AND title = '#{params[:title]}'"      
       end
       
       unless params[:body].length.zero? 
          conditions += " AND body LIKE '%#{params[:body]}%'"      
       end
    
       @posts = Post.find(:all, :conditions => "1" + conditions)
    Che è sostanzialmente simile a quello che ho sempre fatto in PHP, vorrei però capire se esiste una soluzione più elegante.

  3. #3
    Originariamente inviato da Sgurbat
    Che è sostanzialmente simile a quello che ho sempre fatto in PHP, vorrei però capire se esiste una soluzione più elegante.
    Più che non elegante questa modalità è assolutamente insicura poiché non protegge dall'SQL Injection.
    Mai interpolare direttamente il valore di params in una query.
    Puoi risolvere il problema in diversi modi. All'epoca creai anche un semplice plugin per fare questo: http://code.simonecarletti.com/wiki/multiconditions

    L'idea di base è questa. Il valore di conditions è un array dove il primo elemento è una stringa, i successivi i parametri da interpolare.

    codice:
    @posts = Post.find(:all, :conditions => ["title = ? OR body like ?",title,body])
    Puoi quindi scrivere una cosa tipo

    codice:
    statement = []
    conditions = []
    
    if params[:title]
      statement << "title = ?"
      conditions << params[:title]
    end
    
    if params[:body]
      statement << "body = ?"
      conditions << params[:body]
    end
    
    @posts = Post.all :conditions => conditions.unshift(statement.join(" OR "))
    Questo è ovviamente il formato esteso per farti comprendere il funzionamento.
    La logica poi la puoi incapsulare in un oggetto, sia esso la libreria o un plugin.

    Esistono infatti diversi plugin atti allo scopo come Pacecar e Searchlogic.

    Alcuni lavorano sulle conditions, altri usano i named scope.

  4. #4
    Utente di HTML.it L'avatar di deleted_id_48586
    Registrato dal
    Nov 2002
    Messaggi
    1,732
    Originariamente inviato da weppos
    Più che non elegante questa modalità è assolutamente insicura poiché non protegge dall'SQL Injection.
    Mai interpolare direttamente il valore di params in una query.
    Vero

    Puoi risolvere il problema in diversi modi. All'epoca creai anche un semplice plugin per fare questo: http://code.simonecarletti.com/wiki/multiconditions
    Grazie, molto interessante, ora me lo leggo per bene

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.