I just noticed this odd behaviour (in rails 2.2.2). It looks like
changing the type with update_attributes doesn’t work (but returns
true!), but changing the field and then saving it does work. Here i
have an STI situation where TeachingObject and LearningObject extend
Resource.
The bit where update_attributes returns true, yet seems to fail, is
rather disconcerting. Can anyone explain what’s going on here?
I just noticed this odd behaviour (in rails 2.2.2). It looks like
changing the type with update_attributes doesn’t work (but returns
true!), but changing the field and then saving it does work. Here i
have an STI situation where TeachingObject and LearningObject extend
Resource.
The bit where update_attributes returns true, yet seems to fail, is
rather disconcerting. Can anyone explain what’s going on here?
I believe that the type column is marked as a protected attribute or
something along those lines.
I just noticed this odd behaviour (in rails 2.2.2). � It looks like
changing the type with update_attributes doesn’t work (but returns
true!), but changing the field and then saving it does work. �Here i
have an STI situation where TeachingObject and LearningObject extend
Resource.
The bit where update_attributes returns true, yet seems to fail, is
rather disconcerting. �Can anyone explain what’s going on here?
I believe that the type column is marked as a protected attribute or
something along those lines.
Fred
ahhh, well that would explain it. It would also explain why
update_attribute returns true - it just silently ignores the protected
fields. It’s a bit annoyin that the api doesn’t mention this: to quote
Single table inheritance
Active Record allows inheritance by storing the name of the class in a column that by default is named “type” (can be changed by overwriting Base.inheritance_column). This means that an inheritance looking like this:
class Company < ActiveRecord::Base; end
class Firm < Company; end
class Client < Company; end
class PriorityClient < Client; end
When you do Firm.create(:name => “37signals”), this record will be saved in the companies table with type = “Firm”. You can then fetch this row again using Company.find(:first, “name = ‘37signals’”) and it will return a Firm object.
If you don‘t have a type column defined in your table, single-table inheritance won‘t be triggered. In that case, it‘ll work just like normal subclasses with no special magic for differentiating between them or reloading the right type with find.