DRYing my app

Hello.

I am using auto-complete fields in my application and I found myself
duplicating a lot of code.

Here is a sample of what I have in my view:

        <%= text_field_with_auto_complete :model,
          :codeA,
          :maxlength    => 35,
          :size         => 35,
          :frequency    => 0,
          :style        => 'off',
          :autocomplete => 'off' -%>
        <div class=auto_complete id=model_codeA_auto_complete

style=‘display: none’>

        <%= text_field_with_auto_complete :model,
          :codeB,
          :maxlength    => 35,
          :size         => 35,
          :frequency    => 0,
          :style        => 'off',
          :autocomplete => 'off' -%>
        <div class=auto_complete id=model_codeB_auto_complete

style=‘display: none’>

The models all look the same too:

class ModelA < ActiveRecord::Base
self.table_name = ‘modela’

def self.get_codes
return ModelA.find(
:all,
:select => ‘code’,
:order => ‘code’
).collect {|row| row.code}
end
end

class ModelB < ActiveRecord::Base
self.table_name = ‘modelb’

def self.get_codes
return ModelB.find(
:all,
:select => ‘code’,
:order => ‘code’
).collect {|row| row.code}
end
end

: : : and so on…

The only thing that changes in the methods is the name of the model,
as you can see.

In my controller I have another set of methods to retrieve the
necessary information for the drop downs and auto-completes:

def auto_complete_for_codeA
@codes = ModelA.get_codes
render_options(@codes, params[:model][:codeA])
end

def auto_complete_for_codeB
@codes = ModelB.get_codes
render_options(@codes, params[:model][:codeB])
end

: : : and so on…

‘render_options’ is another method that I got DRY enough and I don’t
need to make any changes as of right now. It finds matching values in
@codes based on the second parameter value, then renders a partial.

As you can see there is a lot of duplication in all of this and I
would like to make it as DRY as possible. The only thing I think can
be done is to to modify all those controller methods by soft-coding
somehow the name of the Model to be used and get something like this:

def auto_complete_for_codeA
render_options(:ModelA, params[:model][:codeA])
end

def auto_complete_for_codeB
render_options(:ModelB, params[:model][:codeB])
end

Then render_option would do all the grunt work converting :myModelx to
a usable model name. If you know how to make this happen and/or have
better ideas please let me know.

Thanks a lot.

Pepe

Sorry no solutions here, but a couple of thoughts that might end up
sending you in the right direction. I’m still new to rails and haven’t
actually implemented anything like what you’re describing.

If modelA & modelB only differ by an attribute, maybe inheritance is
your answer…So something like:
class baseModel
basic_stuff_here
class modelA < baseModel
code method # returns codeA
class modelB < baseModel
code method # returns codeB

Then I’m wondering if the rails framework would support (I suspect
somehow with routing it does) creating just the basemodel controller/
view. In there everything would be ‘the same’ just using the inherited
methods.

Obviously this is an idea of where to go…I’m sure there are
stumbling blocks on the way.
-Dale

Hi Dale,

Sorry for the delay in responding. I’ve been quite busy these past
days.

Thanks for the idea. I think I understand the underlying purpose.
However, since nobody was answering this posting I decided to create a
new one with a simpler question and I got a few answers that really
helped me. I have not tried them yet but if you are interested, here
is the link:

http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/51e90f981ca81f6a/afff04e37620922e?hl=en&lnk=gst&q=soft-coding#afff04e37620922e

Thanks again.

Pepe