This project is archived and is in readonly mode.
Unexpected side effect of update_attribute implementation change on associations and attributes
Reported by Hugh Kelsey | July 12th, 2010 @ 04:01 PM | in 3.x
I believe this was the result of 01629d180468049d17a8 as rolling back to the commit before removed the issue.
Having:
class Account < ActiveRecord::Base
has_many :users
end
class User < ActiveRecord::Base
belongs_to :account
after_create :create_account
def create_account
self.update_attribute(:account, Account.create) if self.account_id.blank?
end
end
I now get a sqlite3 error that there is no column 'account' for the Users table. I'm not sure if this was intentional or not. Additionally:
class Task < History
attr_accessor :complete_note
def complete_note=(complete_note)
self.body = body + "\n" + complete_note
end
end
@task.update_attribute(:complete_note, "Foo Bar")
Produces the same error, no such column 'complete_note' in 'tasks' table.
The commit also mentions a change where updated_at doesn't change with update_attribute, does that pose any issues for anyone else or is it just me?
Comments and changes to this ticket
-
Neeraj Singh July 12th, 2010 @ 05:25 PM
- Milestone set to 3.x
- Tag set to rails 3, activerecord
- Assigned user set to Neeraj Singh
- Importance changed from to Low
-
Neeraj Singh July 12th, 2010 @ 09:01 PM
- State changed from new to wontfix
The commit also mentions a change where updated_at doesn't change with update_attribute, does that pose any issues for anyone else or is it just me?
updated_at/on will always change. I am not able to see where in commit message I mentioned that updated_at/on will not change.
The idea behind update_attribute is that user should be pretty much assured that update_attribute changes the field in the database. That is why validation and callbacks are not called so that no one can prevent the update to the database.
case 1
self.update_attribute(:account, Account.create)
Above case is not supported and that is okay. That case can be changed to
self.update_attribute(:account_id, Account.create.id)
case 2
@task.update_attribute(:complete_note, "Foo Bar")
In the above case only database change should take place is to change updated_at/on. And for that you can simply do
@task.touch
I understand that update_attribute would be used in a lot lesser number of cases and that is the intent. update_attributes should be used in majority of cases and update_attribute should be limited to a few cases where you want to update a field. For example after sending out an email. If a bug prevents marking that field as updated then user might get a number of emails delivered to him/her.
Discussed the issue with José Valim and he is okay with it.
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>