# Read-only fields

**URL:** <https://www.ruby-forum.com/t/read-only-fields/92355>\
**Category:** Rails\
**Created:** [April 18, 2007, 5:38pm UTC](https://www.ruby-forum.com/t/read-only-fields/92355 "2007-04-18T17:38:26Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 18, 2007, 5:38pm UTC](https://www.ruby-forum.com/t/read-only-fields/92355/1 "2007-04-18T17:38:26Z")

</div>

I have a field in my table that I do not want ActiveRecord to update.  
I would like to retrieve that field, and have it displayed.

However, when I perform update, and ActiveRecord generates the SQL, I  
don’t want it to include the field in it’s update. I haven’t figured  
out a way to do this.

Any ideas?

---

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 18, 2007, 5:54pm UTC](https://www.ruby-forum.com/t/read-only-fields/92355/2 "2007-04-18T17:54:27Z")

</div>

On Apr 18, 2007, at 5:37 PM, Dean H. wrote:

> I have a field in my table that I do not want ActiveRecord to update.  
> I would like to retrieve that field, and have it displayed.
> 
> However, when I perform update, and ActiveRecord generates the SQL, I  
> don’t want it to include the field in it’s update. I haven’t figured  
> out a way to do this.

If the attribute is only updated under the hood, with triggers,  
Model.update\_all, etc. then

attr\_readonly :foo

is what you need, but according to

[http://dev.rubyonrails.org/ticket/6896](http://dev.rubyonrails.org/ticket/6896)

is scheduled for 1.2.4 (I thought it was accepted for 1.2).

– fxn

---

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 20, 2007, 4:13am UTC](https://www.ruby-forum.com/t/read-only-fields/92355/3 "2007-04-20T04:13:26Z")

</div>

Dean H. wrote:

> I have a field in my table that I do not want ActiveRecord to update.  
> I would like to retrieve that field, and have it displayed.
> 
> However, when I perform update, and ActiveRecord generates the SQL, I  
> don’t want it to include the field in it’s update. I haven’t figured  
> out a way to do this.

Why not write unit tests that check the value never changes, then write  
it  
liberally? Who cares if the magnetism actually hits that database file  
storage block, if the users never see the difference?

DBs were not made for the C++ ‘const’ concept…

–  
Phlip  
[Test Driven Ajax (on Rails) [Book]](http://www.oreilly.com/catalog/9780596510657/)  
“Test Driven Ajax (on Rails)”  
assert\_xpath, assert\_javascript, & assert\_ajax

---

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 20, 2007, 3:51pm UTC](https://www.ruby-forum.com/t/read-only-fields/92355/4 "2007-04-20T15:51:15Z")

</div>

Xavier: Most of those are solved with a lock\_version field and  
optimistic  
locking. However, there are other conditions where a bulk update might  
not  
be ideal.

---

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 20, 2007, 8:59am UTC](https://www.ruby-forum.com/t/read-only-fields/92355/5 "2007-04-20T08:59:53Z")

</div>

On Apr 20, 2007, at 4:11 AM, Phlip wrote:

> storage block, if the users never see the difference?  
> Problem are race conditions:

1. user = User.find(id)

2. another process udates his record

3. user.save

Now the field is overwritten with the previous value, so the record  
is broken. Even if you perform an extra read from the database in a  
before\_save to get the value at that moment there’s risk for a race  
condition.

In a muti-process environment there are race conditions if you don’t  
lock resources, but if the data is updated always by actions the  
heuristic “last update wins” is normally good enough. When there are  
updates that only come from the database that doesn’t apply.

– fxn

---

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 20, 2007, 5:45pm UTC](https://www.ruby-forum.com/t/read-only-fields/92355/6 "2007-04-20T17:45:28Z")

</div>

On Apr 20, 2007, at 3:50 PM, Brian H. wrote:

> Xavier: Most of those are solved with a lock\_version field and  
> optimistic locking. However, there are other conditions where a  
> bulk update might not be ideal.

There are situations where you have an attribute that is _always_  
maintained outside AR. There, optimistic locking is not what you  
need. To program that way you need to catch an exception, reload that  
special value, preserve the rest, and loop until eventually some save  
succeeds. That’s cumbersome.

What you really need is a transparent solution that provides a  
regular model.save that ignores the field altogether. That’s why  
there’s a patch to add attr\_readonly in the cue.

– fxn

---

<div class="post-metadata">

**Author:** ![deanhiller](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/df705f/32.png) [@deanhiller](https://www.ruby-forum.com/u/deanhiller)\
**Post date:** [April 20, 2007, 5:54pm UTC](https://www.ruby-forum.com/t/read-only-fields/92355/7 "2007-04-20T17:54:28Z")

</div>

Yup, I agree 100%. That’s just one of the many “other conditions” I  
hinted  
at. I misinterpred your example (another process) to mean the same  
program,  
not an outside entity.
