# Why not \[\] as ActiveRecord::Base class method?

**URL:** <https://www.ruby-forum.com/t/why-not-as-activerecord-base-class-method/117201>\
**Category:** Rails\
**Created:** [October 14, 2007, 6:50pm UTC](https://www.ruby-forum.com/t/why-not-as-activerecord-base-class-method/117201 "2007-10-14T18:50:32Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![adistarmid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f14d63/32.png) [@adistarmid](https://www.ruby-forum.com/u/adistarmid)\
**Post date:** [October 14, 2007, 6:50pm UTC](https://www.ruby-forum.com/t/why-not-as-activerecord-base-class-method/117201/1 "2007-10-14T18:50:32Z")

</div>

Here’s a little method

module ActiveRecord  
class Base  
def self.  
find(id)  
end  
end  
end

So you can write

MyModel[12]

as an equivalent to

MyModle.find(12)

Just a little sugar, nothing else really. Is anyone aware of why that  
would be ill-advised? It seems to work with my extremely limited  
testing.

It’s non-orthogonal with respect to association proxies, so maybe that’s  
bad:

MyModel[12] is the same as MyModel.find(12)

but

MyModel.friends[12] is not the same as MyModel.friends.find(12)

---

<div class="post-metadata">

**Author:** ![adistarmid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f14d63/32.png) [@adistarmid](https://www.ruby-forum.com/u/adistarmid)\
**Post date:** [October 14, 2007, 9:30pm UTC](https://www.ruby-forum.com/t/why-not-as-activerecord-base-class-method/117201/2 "2007-10-14T21:30:57Z")

</div>

jamis buck has suggested the same thing:  
[http://weblog.jamisbuck.org/2007/4/4/activerecord-base-find-shortcut](http://weblog.jamisbuck.org/2007/4/4/activerecord-base-find-shortcut)

---

<div class="post-metadata">

**Author:** ![adistarmid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f14d63/32.png) [@adistarmid](https://www.ruby-forum.com/u/adistarmid)\
**Post date:** [October 16, 2007, 5:10pm UTC](https://www.ruby-forum.com/t/why-not-as-activerecord-base-class-method/117201/3 "2007-10-16T17:10:59Z")

</div>

My instinct is to say, “yes, but what happens when record #5 is  
deleted?” There are two problems at play:

1. The use of incrementing integers for primary keys (bad, btw, we  
need guids much of the time) misleads us into thinking of the table as  
an array indexed by the primary keys. It is not. It is a collection  
indexed by the primary keys.
2. The use of the [] operator with integer operands likewise  
intuitively directs to an array. But in ruby, a[5] might be the sixth  
element of an array, or the value of a hash for the key 5.

Since these classes are mapped to tables, and tables are certainly  
collections of rows, then the use of the [] operator is sensible.

HOWEVER…

You are not the sole maintainer of this code. Sooner or later,  
someone else is going to maintain it. You are changing a base  
behavior of the system. Be sure to leave markers.

Is MyModel.friends.find even well defined?

---

<div class="post-metadata">

**Author:** ![adistarmid](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/f14d63/32.png) [@adistarmid](https://www.ruby-forum.com/u/adistarmid)\
**Post date:** [October 17, 2007, 4:25pm UTC](https://www.ruby-forum.com/t/why-not-as-activerecord-base-class-method/117201/4 "2007-10-17T16:25:27Z")

</div>

Student wrote:

> My instinct is to say, “yes, but what happens when record #5 is  
> deleted?”

Presumably, MyModel[5] would then simply find nothing.

> There are two problems at play:
> 
> 1. The use of incrementing integers for primary keys (bad, btw, we  
> need guids much of the time)

Why?

> misleads us into thinking of the table as  
> an array indexed by the primary keys. It is not. It is a collection  
> indexed by the primary keys.

True, but so what? The distinction is somewhat irrelevant for the  
current question.

[…]

> You are not the sole maintainer of this code. Sooner or later,  
> someone else is going to maintain it. You are changing a base  
> behavior of the system.  
> […]

I think it’s more correct to say that he’s _adding_ a behavior to the  
system – after all, .find should still work.

## Best,

Marnen Laibow-Koser  
removed\_email\_address@domain.invalid
