views:

352

answers:

2

I have a rails app with several models.

I have a function that I want to access from several models.

What's the best place to put this code and how can I make it accessible from the models that need to get at it?

My understanding is that helpers are just for views. Is this correct?

It seems wrong to create a plug-in and put it in the vendor folder - this is my code and integral to my app. Is this correct?

Thanks.

+10  A: 

The simplest solution would be to create a module under lib and mix this into the models that need it, for instance, in lib/fooable.rb:

module Fooable
  def do_foo
  end
end

And then in your various models:

class MyModel < ActiveRecord::Base
  include Fooable
end

No need to require fooable.rb, the Rails autoloading mechanism will find it for you as long as it's named using correct conventions.

Luke Redpath
+1  A: 

In order to lessen the repetition of code, you could also create a main class which would include that module and the simply inherit from it from every model you'd like to share the behaviour.

Something like

module Fooable
  def do_foo
  end
end

class ParentModel < ActiveRecord::Base
  incluse Fooable
end

class Product < ParentModel end
class User < ParentModel end
class Item < ActiveRecord::Base

Thus, in that example, both Product and User would share the do_foo functionality and Item would not.

Yaraher
This works of course, but I would question whether eliminating the repetition is worth dirtying the inheritance chain; you could argue that this is exactly what modules help avoid: unnecessary inheritance. Is trying to avoid multiple include statements taking DRY one step too far? I think it might be.
Luke Redpath