I’m not using ferret because the search I need is not that complicated.
I created a basic active record search. I’m using some code from the
pragmaticprogrammer book. This is the issue:
I can get the single keyword to work fine when entered into the search
box, but when you put to keywords separated by a space the search
returns no results. It makes sense since the function below was
structured for a single key search. So I tried to modify it by getting
the string, splitting it and trying to do a loop for the newly splitted
string. Here is when I get the error “can’t convert Array into String”.
I’m sure that I’m doing some logical mistakes but I’m new to ruby on
rails so please forgive me.
hope some one can help
def conditions_by_like(value, *columns)
myArray = value.gsub(/[^\A-Za-z0-9\s]/, "").split(/ /)
myArray.each do |itemz|
columns = self.user_columns if columns.size==0
columns = columns[0] if columns[0].kind_of?(Array)
conditions = columns.map { |c|
c = c.name if c.kind_of? ActiveRecord::ConnectionAdapters::Column
"`#{c}` LIKE " +
ActiveRecord::Base.connection.quote("%#{itemz}%")
}.join(" OR ")
end
end
On 26 Jun 2008, at 12:55, Sam G. wrote:
the string, splitting it and trying to do a loop for the newly
myArray = value.gsub(/[^\A-Za-z0-9\s]/, “”).split(/ /)
end
You’re not returning the value you think you are (each always returns
the collection you search for).
Fred
Frederick C. wrote:
On 26 Jun 2008, at 12:55, Sam G. wrote:
the string, splitting it and trying to do a loop for the newly
myArray = value.gsub(/[^\A-Za-z0-9\s]/, “”).split(/ /)
end
You’re not returning the value you think you are (each always returns
the collection you search for).
Fred
so what would be the correct way? I tested the above loop with a simple
string(below) and it works
<%
theValue = “Paris in the Spring”
myArray = theValue.gsub(/[^\A-Za-z0-9\s]/, “”).split(/ /)
myArray.each do |itemz|
%>
<%= itemz %>
<%
end
%>
that’s completely different (since here you’re not using the return
value of each, whereas in your other example you are)
my point is that if you do
x = [1,2,3].each { …}
then x will always be set to [1,2,3], so in your case your
conditions_by_like function always returns myArray and completely
discards all the processing you do in the each block.
Depending on what you want to do you might want to use map/collect or
just accumulate the result in a local varaible and return that.
Fred
I understand the logic now. But could you give me an example on how I
would do a map/collect or accumulate it in a variable? I just want to
make sure that if I type in 2 words separated by a space
i:e John D. both John and Doe will be processed. I’m not a ruby expert
and just started so I would really appreciate your help and Patience.
Thanks
On 26 Jun 2008, at 14:22, Sam G. wrote:
Fred
myArray.each do |itemz|
%>
<%= itemz %>
<%
end
%>
that’s completely different (since here you’re not using the return
value of each, whereas in your other example you are)
my point is that if you do
x = [1,2,3].each { …}
then x will always be set to [1,2,3], so in your case your
conditions_by_like function always returns myArray and completely
discards all the processing you do in the each block.
Depending on what you want to do you might want to use map/collect or
just accumulate the result in a local varaible and return that.
Fred
Frederick C. wrote:
On 26 Jun 2008, at 14:52, Sam G. wrote:
conditions_by_like function always returns myArray and completely
expert
and just started so I would really appreciate your help and Patience.
Thanks
result = something
[1,2,3].each do |x|
#do something to result
end
return result
or, if it can be expressed with collect
[1,2,3].collect do |x|
x*2
end
evaluates to [2,4,6] (which I assume you already know since you are
Thanx allot! you the man.
On 26 Jun 2008, at 14:52, Sam G. wrote:
conditions_by_like function always returns myArray and completely
expert
and just started so I would really appreciate your help and Patience.
Thanks
result = something
[1,2,3].each do |x|
#do something to result
end
return result
or, if it can be expressed with collect
[1,2,3].collect do |x|
x*2
end
evaluates to [2,4,6] (which I assume you already know since you are
using map (which is just an alias for collect) in your code already
I’m not sure what you want the final output of your function to be,
but i’m guessing that
myArray.collect do |itemz|
…
end.join(’ OR ')
If you have more than a small number of rows in your table this will
be dog slow since it will require a full table scan each time.
Fred