ok, I have this Rails code which I want to make more Rubyish.
controller:
def tracks
@term = params[:term] || ''
if @term.blank?
@tracks = []
else
@tracks = Track.find_by_contents @term
end
end
view:
<% for word in %w{ tracks beats users profiles } %>
<% unless controller.action_name == word %>
<%= link_to "search similar #{word}", :action => word, :term => @term %>
<br/>
<% end %>
<% end %>
now this is using Ferret, the Ruby port of Lucene, via the
acts_as_ferret Rails plugin.
(by the way, Ferret actually runs faster than Lucene, according to the
Ferret site. I don't know how, but that's pretty cool.)
anyway, as you can see, I have one method in the controller and a view
which assumes the existence of three additional methods.
what I want to do is have only one method in the controller, which
does all the searching.
now I could do:
def tracks
@term = params[:term] || ''
case params[:thing_to_search_for]
when "tracks"
if @term.blank?
@tracks = []
else
@tracks = Track.find_by_contents @term
end
when "beats"
if @term.blank?
@beats = []
else
@beats = Beat.find_by_contents @term
end
when "profiles"
if @term.blank?
@profiles = []
else
@profiles = Profile.find_by_contents @term
end
when "users"
if @term.blank?
@users = []
else
@users = User.find_by_contents @term
end
end
end
however, this is what Rails users call "wet" and everybody else calls "stupid."
what I want to do is a properly elegant thingy. here's roughly what I envision:
def search
@term = params[:term] || ''
instance_variable_set("@#{params[:thing_to_search_for]}", [])
unless @term.blank?
eval("@#{params[:thing_to_search_for]}") =
(eval(params[:thing_to_search_for].capitalize)).find_by_contents @term
end
end
I think I should probably just start coding in Lisp and save everyone
the irritation, but in the meantime, how does that look, in terms of a
tree to bark up? that is to say, does it look like the right tree, or
the wrong tree?
if you can puzzle it through, I think what I have here is an elegant
algorithm expressed in very-much-other-than-elegant code. (but I could
be wrong!)
···
--
Giles Bowkett
http://www.gilesgoatboy.org