Say I have two entries in my database:
1) Bartlett
2) Peabody
A user runs a search, and I want to return all matches to the name
above. So the user types in "Bartlett Street", and I want it to
return #1 above. My ruby code looks like:
Note that because the user types in "Street" at the end, I can not do
a explicit "==" comparison.
When I type in "Peabody" as the search term, why does it also return
"Bartlett". I understand that "B" comes before "P" in the alphabet,
but I would expect the "<=" to compare on each character in the
string, not just the first ... but it seems like it only checks the
first character?
I guess it is more of a SQL syntax question, but does anyone have a
better way to code this in ruby? Seems like such a simple thing to be
able to do.
When I type in "Peabody" as the search term, why does it also return
"Bartlett". I understand that "B" comes before "P" in the alphabet,
but I would expect the "<=" to compare on each character in the
string, not just the first ... but it seems like it only checks the
first character?
That's a fairly standard lexicographic ordering: starting from the first character, compare pairs of characters until you find a pair that differ (or until you run out of pairs)
I guess it is more of a SQL syntax question, but does anyone have a
better way to code this in ruby? Seems like such a simple thing to be
able to do.
Correct. You want to use the % sql wildcard, ie "where name like 'Barlett%'"
Thanks for those suggestions!! Inspired by those, I came up with a
new solution ....
In my case @term is always going to be longer than fieldName, so I
would need to search for the wildcard as part of the fieldName, and
not the @term. Instead, I decided that what I really need to do, is
shorten @term. So if @term = "Bartlett Street", I really only want to
match against the first string there ... "Bartlett" and lose the
"Street" part of the @term.
if (!@match.nil?)
@return= Return.find(:all, :conditions=>['(fieldName like ?)',
@match])
end
That seems to get me what I want ... but it is a pretty unique case.
I'm sure using the wildcard would provide a more general solution, but
I wasn't sure how to apply the wildcard to the "fieldName" in the SQL
statement ... I just kept getting syntax errors. This will work fine
for me now.