rails/activerecord/test
eileencodes 6f15b276cb Always validate record if validating a virtual attribute
Fixes #23645

When you're using an `attr_accessor` for a record instead of an
attribute in the database there's no way for the record to know if it
has `changed?` unless you tell it `attribute_will_change!("attribute")`.

The change made in 27aa4dd updated validations to check if a record was
`changed?` or `marked_for_destruction?` or not `persisted?`. It did not
take into account virtual attributes that do not affect the model's
dirty status.

The only way to fix this is to always validate the record if the
attribute does not belong to the set of attributes the record expects
(in `record.attributes`) because virtual attributes will not be in that
hash.

I think we should consider deprecating this particular behavior in the
future and requiring that the user mark the record dirty by noting that
the virtual attribute will change. Unfortunately this isn't easy because
we have no way of knowing that you did the "right thing" in your
application by marking it dirty and will get the deprecation warning
even if you are doing the correct thing.

For now this restores expected behavior when using a virtual attribute
by always validating the record, as well as adds tests for this case.

I was going to add the `!record.attributes.include?(attribute)` to the
`should_validate?` method but `uniqueness` cannot validate a virtual
attribute with nothing to hold on to the attribute. Because of this
`should_validate?` was about to become a very messy method so I decided
to split them up so we can handle it specifically for each case.
2016-02-20 09:15:39 -05:00
..
active_record/connection_adapters introduce conn.data_source_exists? and conn.data_sources. 2015-09-22 19:48:44 +02:00
assets
cases Always validate record if validating a virtual attribute 2016-02-20 09:15:39 -05:00
fixtures Fixed where for polymorphic associations when passed an array containing different types. 2016-02-16 10:41:26 -08:00
migrations Internal test migrations use the private 'Current' version 2015-12-15 17:18:09 +10:30
models Fixed where for polymorphic associations when passed an array containing different types. 2016-02-16 10:41:26 -08:00
schema eliminate warnings about multiple primary keys on habtm join tables 2016-02-19 15:31:56 -08:00
support Deprecate #table_exists?, #tables and passing arguments to #talbes 2015-11-09 23:13:23 +09:00
.gitignore
config.example.yml Remove legacy mysql adapter 2015-12-17 15:54:57 +00:00
config.rb