Hello guys,
I trying to create the conditions of my search, but I have some
troubles.
This is the method I'm trying to create in my model.
def self.searchadv(title, place, category, date)
!title.blank? ? conditions = ['title LIKE ?', "%#{title}%"] :
conditions = []
if conditions
!place.blank? ? conditions << [' AND place LIKE ?',
"%#{place}%"] : conditions << []
!place.blank? ? conditions << [' AND category LIKE ?',
"%#{place}%"] : conditions << []
!place.blank? ? conditions << [' AND date LIKE ?', "%#{place}%"]
: conditions << []
else
!place.blank? ? conditions << [' place LIKE ?', "%#{place}%"] :
conditions << []
!place.blank? ? conditions << [' category LIKE ?', "%#{place}%"]
: conditions << []
!place.blank? ? conditions << [' date LIKE ?', "%#{place}%"] :
conditions << []
end
find(:all, :conditions => conditions)end
I get this error
wrong number of bind variables (4 for 1) in: title LIKE ?
if I delete this:
if conditions
!place.blank? ? conditions << [' AND place LIKE ?', "%#{place}%"] :
conditions << []
!place.blank? ? conditions << [' AND category LIKE ?', "%#{place}%"]
: conditions << []
!place.blank? ? conditions << [' AND date LIKE ?', "%#{place}%"] :
conditions << []else
!place.blank? ? conditions << [' place LIKE ?', "%#{place}%"] :
conditions << []
!place.blank? ? conditions << [' category LIKE ?', "%#{place}%"] :
conditions << []
!place.blank? ? conditions << [' date LIKE ?', "%#{place}%"] :
conditions << []end
Everything works great, but I need this other options in order to create
my
search and I don't undertand why the error is in the "LiKE"
Does anyone could help me please?
Thanks in advance!
on 2012-12-02 23:27
on 2012-12-03 02:20
On Dec 2, 6:26pm, Jean <josor...@gmail.com> wrote: > Hello guys, > > I trying to create the conditions of my search, but I have some troubles. > > This is the method I'm trying to create in my model. > > def self.searchadv(title, place, category, date) > !title.blank? ? conditions = ['title LIKE ?', "%#{title}%"] : conditions = [] This (and the remainder) would probably be more readable if you used present? rather than !blank? > if conditions > !place.blank? ? conditions << [' AND place LIKE ?', "%#{place}%"] : conditions << [] I think you are confusing << with concat. This code appends a single item to conditions (that is a 0 or 2 item array) which isn't what you intended. I'd probably write this as conditions += [' and ...', "%#{place}" if place.present? More readable (I think) would be fragments = [] bind_variables = [] if title.present? fragments << 'title LIKE ?' bind_variables << title end If place.present? fragments << 'category like ?' bind_variables << %#{place}%" ... end conditions = [fragments.join(' AND ')] + bind_variables Which removes some of the duplication you currently have. You might also want to look at something like squeel, which extends active record to make it easier to write this sort of query. Fred
on 2012-12-04 04:35
On Sun, Dec 2, 2012 at 4:26 PM, Jean <josorioe@gmail.com> wrote: > def self.searchadv(title, place, category, date) Colour me doubtful, but since you're passing in category and date, why are you using place in your category and date subclauses? > !place.blank? ? conditions << [' AND category LIKE ?', "%#{place}%"] > : conditions << [] > !place.blank? ? conditions << [' AND date LIKE ?', "%#{place}%"] : > conditions << [] I really like the way Fred puts it together by joining the fragments into the where clause.
on 2012-12-04 04:47
On Mon, Dec 3, 2012 at 6:26 AM, Jean <josorioe@gmail.com> wrote: > !place.blank? ? conditions << [' AND category LIKE ?', "%#{place}%"] : conditions << [] > wrong number of bind variables (4 for 1) in: title LIKE ? > > Everything works great, but I need this other options in order to create > my search and I don't undertand why the error is in the "LiKE" > > Does anyone could help me please? > > Thanks in advance! > you can also do it like this def self.searchadv(title, place, category, date) klass = scoped klass = klass.where(conditions for title here) if title.present? klass = klass.where(conditions for place here) if place.present? klass = klass.where(conditions for category here) if category.present? klass = klass.where(conditions for date here) if date.present? scopedend This is using rails 3. But you can still use this for rails 2.3 (i'm not sure what version they introduced this), you just have to change the where calls to scoped > > --
on 2012-12-04 04:48
On Tue, Dec 4, 2012 at 11:46 AM, Jim Ruther Nill <jvnill@gmail.com> wrote: >> >> end >> !place.blank? ? conditions << [' AND category LIKE ?', "%#{place}%"] : conditions << [] >> Thanks in advance! > scopedend > > This is using rails 3. But you can still use this for rails 2.3 (i'm not > sure what version they introduced this), > you just have to change the where calls to scoped > the last line that calls scoped should be klass. my bad. >> https://groups.google.com/d/msg/rubyonrails-talk/-.... > --
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.