Hello,
I am having difficulty dynamically building a query. I want to ensure
that I’m using Active Record protection against SQL injection attacks.
In PHP land, I would have built up the query in my logic & attempted to
clean every variable - a bit tedious really.
I want to be able to achieve something like:
events = Event.find(:all,
:conditions => [DynamicallyBuiltQuery ,
DynamicllyBuiltListOfVariables],
:order => event_datetime_start)
It would be great if someone could please enlighten me on the rails way,
or if there is a better way to do this.
rgds,
- matt.
This is roughly how I’ve mangle rails as I would have done it in PHP
event = Event.new(params[:event])
strQuery = ""
unless event.event_name.blank
strQuery = "UPPER(event_name) LIKE UPPER(" +
event.event_name.to_s + ") "
end
unless event.artist.blank
strQuery += sql_and(strQuery)
strQuery += "UPPER(artist) LIKE UPPER(" + event.artist.to_s + ")
"
end
unless event.city.blank
strQuery += sql_and(strQuery)
strQuery += "UPPER(city) LIKE UPPER(" + event.city.to_s + ") "
end
strQuery += sql_and(strQuery)
strQuery += "event_datetime_start >= '" +
event.event_datetime_start "’) AND "
strQuery += “event_datetime_end <= '” + event.event_datetime_end
"’) "
events = Event.find(:all, :conditions [strQuery])
Which could produce…
events = Event.find(:all,
:conditions => [“UPPER(event_name) LIKE UPPER(event_name) AND
event_datetime_start >= ‘some-date’ AND event_datetime_end <=
‘another-date’”],
:order => event_datetime_start)
or
events = Event.find(:all,
:conditions => [“UPPER(event_name) LIKE UPPER(event_name) AND
UPPER(artist) LIKE UPPER(artist) AND event_datetime_start >=
‘some-date’ AND event_datetime_end <= ‘another-date’”],
:order => event_datetime_start)
this is what I want to produce…
events = Event.find(:all,
:conditions => [“event_name LIKE ? AND event_datetime_start >= ? AND
event_datetime_end <= ?” , event_name, some-date, another-date],
:order => event_datetime_start)
or
events = Event.find(:all,
:conditions => ["event_name LIKE ? and Artist LIKE ? AND
event_datetime_start >= ? AND event_datetime_end <= ? , event_name,
artist, some-date, another-date],
:order => event_datetime_start)