Di nuovo

per favore sto impazzendo…qualcuno mi può aiutare (?) Il vecchio post
era questo :

ciao a tutti,

volevo sapere s potevate consigliarmi un modo per fare un input type
condizionato da una select (è un campo di ricerca). Mi speigo meglio:
vorrei fare solo un campo di ricerca e usarlo per tutte le colonne della
mia tabella. Ho già creato la select così:

(nel rhtml)
<%= @colonne = Searchfield.find(:all, :order => “name”)
collection_select(:searchfield, :id, @colonne, :id, :name)%>


e nel controller ho messo diversi if a seconda che @colonne contenga
l’ide selezionato. Ma non funziona niente.

Ci sono modi migliori?

grazie di cuore

On 8/4/06, Giovanno Z. [email protected] wrote:

volevo sapere s potevate consigliarmi un modo per fare un input type
condizionato da una select (è un campo di ricerca). Mi speigo meglio:
vorrei fare solo un campo di ricerca e usarlo per tutte le colonne della
mia tabella. Ho già creato la select così:

se il modello da cercare e’ Contact, potresti fare qualcosa del tipo:

<%= collection_select(:searchfield, :name,
Contact.content_columns.collect{|c| c.name}, :to_s, :humanize) %>
<%= text_field(:searchfield, :value) %>

che crea un select usando le colonne del modello (mette ill nome della
colonna nel valore e la versione “leggibile” nel nome della option).

Alla submit nel controller troverai il nome della colonna in
params[:searchfield][:name] poi:

Contact.find(:all, :conditions=>[“? = ?”, params[:searchfield][:name],
params[:searchfield][:value]])

N.B. devi avere un oggetto Searchfield con campi name e value!

ciao,
Luca

P.S. l’ho scritto al volo, senza testarlo…

Luca M. wrote:

<%= collection_select(:searchfield, :name,
Contact.content_columns.collect{|c| c.name}, :to_s, :humanize) %>
<%= text_field(:searchfield, :value) %>

che crea un select usando le colonne del modello (mette ill nome della
colonna nel valore e la versione “leggibile” nel nome della option).

Alla submit nel controller troverai il nome della colonna in
params[:searchfield][:name] poi:

Contact.find(:all, :conditions=>["? = ?", params[:searchfield][:name],
params[:searchfield][:value]])

grazie Luca,

in effetti così è molto meglio…
al posto del Contact.find io però ho usato questo:

def my_search4
surname = params[:contact][:surname]
tiporicerca = params[:searchfield][:name]
valorericerca = params[:searchfield][:value]
if valorericerca == “”
@contacts = Contact.find_by_sql [“SELECT * FROM contacts WHERE
(surname = ?)”, surname]
else
@contacts = Contact.find_by_sql [“SELECT * FROM contacts WHERE
(surname = ? AND ? = ?)”, surname, tiporicerca,
valorericerca]
end

end

perchè volevo per la ricerca un campo fisso e uno ‘selezionabile’. Il
codice non da problemi ma guarda il log:

Processing ContactController#my_search4 (for 127.0.0.1 at 2006-08-08
12:37:03) [POST]
Session ID: 6a9c308d4683734a3bf779ad0022bcfd
Parameters: {“searchfield”=>{“name”=>“name”, “value”=>“franco”},
“contact”=>{“surname”=>“zangrilli”}, “action”=>“my_search4”,
“controller”=>“contact”}
e[4;36;1mContact Load (0.000000)e[0m e[0;1mSELECT * FROM contacts
WHERE (surname = ‘zangrilli’ AND ‘name’ = ‘franco’)e[0m Completed in
0.06000 (16 reqs/sec)

*****PERCHE’ ‘name’ (‘name’ = ‘franco’) E’ TRA VIRGOLETTE? E’ UN ERRORE?

N.B. devi avere un oggetto Searchfield con campi name e value!

ho creato una tabella searchfields nel mio db ma l’ho lasciata vuota (?)

******se cerco solo per cognome (senza usare la select) la ricerca
funziona. ma se cerco inserendo anche del testo nella textarea della
select allora non ho errore ma non mi viene alcun risultato!

ciao,
Luca

P.S. l’ho scritto al volo, senza testarlo…

grazie mille

ciao,

On 8/8/06, Giovanno Z. [email protected] wrote:

  @contacts = Contact.find_by_sql ["SELECT * FROM contacts WHERE

(surname = ? AND ? = ?)", surname, tiporicerca,
valorericerca]
end
… l’altra volta avevo scritto il tutto al volo, non cosiderando che
Rails fa (giustamente) l’escape dei parametri che si passano come
condizioni, dunque se e’ una stringa la circonda con gli apici. Cosi
non e’ sql corretto (gli apici delimitano i valori non gli
identificatori tipo un nome di colonna)…

Pero’ puoi fare:
@contacts = Contact.find_by_sql [“SELECT * FROM contacts WHERE
(surname = ? AND #{tiporicerca} = ?)”, surname, valorericerca]

oppure potresti fare

@contacts = Contact.find_by_surname(surname,
:conditions=>[“#{tiporicerca} = ?)”, valorericerca])

se hai esigenze piu complesse potresti usare il plugin ez_where
(http://brainspl.at/articles/2006/01/30/i-have-been-busy)

ho creato una tabella searchfields nel mio db ma l’ho lasciata vuota (?)

Non c’e’ bisogno che l’oggetto in si un ActiveRecord, se non vuoi
usare le validazioni puoi semplicemente creare la classe Searchfield
nella directory model senza farle ereditare da ActiveRecord::Base.
Dovrai creare i metodi che ti servono, ma dovrebbe bastare:

class Searchfield
attr_accessor :name, :value
end

ciao,
Luca