# Best practices for shared methods in AR models

**URL:** <https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735>\
**Category:** Rails\
**Created:** [January 14, 2009, 10:04pm UTC](https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735 "2009-01-14T22:04:17Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![joshua-asem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e5b9ba/32.png) [@joshua-asem](https://www.ruby-forum.com/u/joshua-asem)\
**Post date:** [January 14, 2009, 10:04pm UTC](https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735/1 "2009-01-14T22:04:17Z")

</div>

I’m curious to get some feedback from the smart people around here.

I’ve got a method called “to\_permalink” that creates a URL friendly  
permalink from the name, or title attribute of about 4 AR models.

For those same models I want to override the “to\_param” method so it’s  
formatted like

“#{id}-#{permalink}”

It’s obviously not too DRY to define to\_permalink and redefine to\_param  
in each model and the two obvious solutions would be:

1.) Create a new class that these 4 AR models would inherit from.

2.) Add a module to lib and include that in these 4 models.

Either way works, but I’m wondering is there a convention for this type  
of thing? Any caveats to using one vs. the other? If it’s the same  
either way, then what is the most readable in your guys’ opinions?

Let me know what you guys think, or if I’ve missed something altogether.

Thanks,  
– Josh  
[http://iammrjoshua.com](http://iammrjoshua.com)

---

<div class="post-metadata">

**Author:** ![joshua-asem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e5b9ba/32.png) [@joshua-asem](https://www.ruby-forum.com/u/joshua-asem)\
**Post date:** [January 14, 2009, 10:09pm UTC](https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735/2 "2009-01-14T22:09:48Z")

</div>

Write an ActiveRecord plugin, like the “permalink\_fu” →

> **[GitHub - technoweenie/permalink\_fu: ActiveRecord plugin for automatically...](https://github.com/technoweenie/permalink_fu/tree/master)**
>
> master

A good guide to Rails plugins is →   
[http://peepcode.com/products/rails-2-plugin-patterns](http://peepcode.com/products/rails-2-plugin-patterns)

- 

Maurício Linhares  
[http://alinhavado.wordpress.com/](http://alinhavado.wordpress.com/) (pt-br) | [http://blog.codevader.com/](http://blog.codevader.com/)  
(en)

On Wed, Jan 14, 2009 at 6:04 PM, Joshua A.

---

<div class="post-metadata">

**Author:** ![joshua-asem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e5b9ba/32.png) [@joshua-asem](https://www.ruby-forum.com/u/joshua-asem)\
**Post date:** [January 14, 2009, 10:09pm UTC](https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735/3 "2009-01-14T22:09:03Z")

</div>

Another thing I might point out is that I’m just interested in sharing  
methods between these 4 models. If I were to go the new class that the  
models inherit from route, that new class would never be instantiated.  
With that in mind, it seems to be more sensible to go the module route  
to me.

– Josh  
[http://iammrjoshua.com](http://iammrjoshua.com)

Joshua A. wrote:

> I’m curious to get some feedback from the smart people around here.
> 
> I’ve got a method called “to\_permalink” that creates a URL friendly  
> permalink from the name, or title attribute of about 4 AR models.
> 
> For those same models I want to override the “to\_param” method so it’s  
> formatted like
> 
> “#{id}-#{permalink}”
> 
> It’s obviously not too DRY to define to\_permalink and redefine to\_param  
> in each model and the two obvious solutions would be:
> 
> 1.) Create a new class that these 4 AR models would inherit from.
> 
> 2.) Add a module to lib and include that in these 4 models.
> 
> Either way works, but I’m wondering is there a convention for this type  
> of thing? Any caveats to using one vs. the other? If it’s the same  
> either way, then what is the most readable in your guys’ opinions?
> 
> Let me know what you guys think, or if I’ve missed something altogether.
> 
> Thanks,  
> – Josh  
> [http://iammrjoshua.com](http://iammrjoshua.com)

---

<div class="post-metadata">

**Author:** ![joshua-asem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e5b9ba/32.png) [@joshua-asem](https://www.ruby-forum.com/u/joshua-asem)\
**Post date:** [January 15, 2009, 4:29am UTC](https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735/4 "2009-01-15T04:29:00Z")

</div>

On Wed, Jan 14, 2009 at 4:04 PM, Joshua A.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 1.) Create a new class that these 4 AR models would inherit from.

This won’t actually work. Rails would try to use the same table to  
store all of the models if you inherit from one. See the “Single  
Table Inheritance” section from

> **[ActiveRecord::Base](https://api.rubyonrails.org/classes/ActiveRecord/Base.html)**
>
> Active Record Active Record objects don't specify their attributes directly, but rather infer them from the table definition with which they're linked.

> 2.) Add a module to lib and include that in these 4 models.

If you don’t go the plugin route (which I would probably recommend),  
this would be the way to go.

## –

Training by Collective Idea: Ruby on Rails training in a vacation  
setting  
[http://training.collectiveidea.com](http://training.collectiveidea.com) – San Antonio, TX – Jan 20-23

---

<div class="post-metadata">

**Author:** ![joshua-asem](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/e5b9ba/32.png) [@joshua-asem](https://www.ruby-forum.com/u/joshua-asem)\
**Post date:** [January 15, 2009, 5:24am UTC](https://www.ruby-forum.com/t/best-practices-for-shared-methods-in-ar-models/157735/5 "2009-01-15T05:24:36Z")

</div>

Brandon,

I’m familiar with how STI works in Rails, and while you do make a good  
point, that could be handled by calling “set\_table\_name” in each of the  
4 AR models that are inheriting from the parent class. However, I’m  
trying to cut down on the code I write, and that wouldn’t be cutting  
down at all. Another reason I think a module is the way to do this.

A plugin would work also, of course, but IMO a plugin is best suited for  
something that would be used and reused, where this is just a one off  
situation with literally no more than 4 models. It wouldn’t take long to  
put a plugin together that does this, but I would probably never use it  
again… who knows though? I might.

Thanks for the pieces of advice everyone!

– Josh  
[http://iammrjoshua.com](http://iammrjoshua.com)

Brandon K. wrote:

> On Wed, Jan 14, 2009 at 4:04 PM, Joshua A.  
> [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > 1.) Create a new class that these 4 AR models would inherit from.
> 
> This won’t actually work. Rails would try to use the same table to  
> store all of the models if you inherit from one. See the “Single  
> Table Inheritance” section from  
> [ActiveRecord::Base](http://api.rubyonrails.org/classes/ActiveRecord/Base.html)
> 
> > 2.) Add a module to lib and include that in these 4 models.
> 
> If you don’t go the plugin route (which I would probably recommend),  
> this would be the way to go.
> 
> ## –
> 
> Training by Collective Idea: Ruby on Rails training in a vacation  
> setting  
> [http://training.collectiveidea.com](http://training.collectiveidea.com) ï¿½ San Antonio, TX ï¿½ Jan 20-23
