<p>My Invoice model has an address_id attribute, and I don't want this address_id to change FOREVER. So I don't want this to happen outside the class:</p>

<pre><code>invoice.address_id = 1
invoice.address = some_address
</code></pre>

<p>Rails automatically adds this address_id attribute to the model from the invoice table, so how can I declare this attribute private/protected? Calling</p>

<pre><code>attr_protected :address_id
</code></pre>

<p>is most likely not the solution since based on the documentation it only prevents mass assignments.</p>

<p>Thanks!</p>

Not as pretty as a one liner, but code below should work (and you could always do some metaprogramming to write an 'immutable' method)
```
```
def address_id=(id)
  if new_record?
    write_attribute(:address_id, id)
  else
    raise 'address is immutable!'
  end
end
```
```