diff options
6 files changed, 42 insertions, 3 deletions
| diff --git a/activemodel/lib/active_model/errors.rb b/activemodel/lib/active_model/errors.rb index 5ee9413cff..9df4ca51fe 100644 --- a/activemodel/lib/active_model/errors.rb +++ b/activemodel/lib/active_model/errors.rb @@ -419,16 +419,23 @@ module ActiveModel        I18n.translate(key, options)      end -    def marshal_dump +    def marshal_dump # :nodoc:        [@base, without_default_proc(@messages), without_default_proc(@details)]      end -    def marshal_load(array) +    def marshal_load(array) # :nodoc:        @base, @messages, @details = array        apply_default_array(@messages)        apply_default_array(@details)      end +    def init_with(coder) # :nodoc: +      coder.map.each { |k, v| instance_variable_set(:"@#{k}", v) } +      @details ||= {} +      apply_default_array(@messages) +      apply_default_array(@details) +    end +    private      def normalize_message(attribute, message, options)        case message diff --git a/activemodel/test/cases/errors_test.rb b/activemodel/test/cases/errors_test.rb index fc840bf192..e868d20fc8 100644 --- a/activemodel/test/cases/errors_test.rb +++ b/activemodel/test/cases/errors_test.rb @@ -365,4 +365,24 @@ class ErrorsTest < ActiveModel::TestCase      assert_equal errors.messages, serialized.messages      assert_equal errors.details, serialized.details    end + +  test "errors are backward compatible with the Rails 4.2 format" do +    yaml = <<-CODE.strip_heredoc +    --- !ruby/object:ActiveModel::Errors +    base: &1 !ruby/object:ErrorsTest::Person +      errors: !ruby/object:ActiveModel::Errors +        base: *1 +        messages: {} +    messages: {} +    CODE + +    errors = YAML.load(yaml) +    errors.add(:name, :invalid) +    assert_equal({ name: ["is invalid"] }, errors.messages) +    assert_equal({ name: [{ error: :invalid }] }, errors.details) + +    errors.clear +    assert_equal({}, errors.messages) +    assert_equal({}, errors.details) +  end  end diff --git a/activerecord/lib/active_record/associations/collection_association.rb b/activerecord/lib/active_record/associations/collection_association.rb index 3d23fa1e46..46923f690a 100644 --- a/activerecord/lib/active_record/associations/collection_association.rb +++ b/activerecord/lib/active_record/associations/collection_association.rb @@ -75,7 +75,7 @@ module ActiveRecord            r.send(reflection.association_primary_key)          end.values_at(*ids).compact          if records.size != ids.size -          scope.raise_record_not_found_exception!(ids, records.size, ids.size, reflection.association_primary_key) +          klass.all.raise_record_not_found_exception!(ids, records.size, ids.size, reflection.association_primary_key)          else            replace(records)          end diff --git a/activerecord/lib/active_record/reflection.rb b/activerecord/lib/active_record/reflection.rb index 17751c9571..e1a3c59f08 100644 --- a/activerecord/lib/active_record/reflection.rb +++ b/activerecord/lib/active_record/reflection.rb @@ -850,6 +850,10 @@ module ActiveRecord          actual_source_reflection.options[:primary_key] || primary_key(klass || self.klass)        end +      def association_primary_key_type +        klass.type_for_attribute(association_primary_key) +      end +        # Gets an array of possible <tt>:through</tt> source reflection names in both singular and plural form.        #        #   class Post < ActiveRecord::Base diff --git a/activerecord/lib/active_record/type.rb b/activerecord/lib/active_record/type.rb index fdf124283d..4f632660a8 100644 --- a/activerecord/lib/active_record/type.rb +++ b/activerecord/lib/active_record/type.rb @@ -59,6 +59,7 @@ module ActiveRecord      Float = ActiveModel::Type::Float      Integer = ActiveModel::Type::Integer      String = ActiveModel::Type::String +    Value = ActiveModel::Type::Value      register(:big_integer, Type::BigInteger, override: false)      register(:binary, Type::Binary, override: false) diff --git a/activerecord/test/cases/associations/has_many_through_associations_test.rb b/activerecord/test/cases/associations/has_many_through_associations_test.rb index 8defb09db7..83b1f8d4d6 100644 --- a/activerecord/test/cases/associations/has_many_through_associations_test.rb +++ b/activerecord/test/cases/associations/has_many_through_associations_test.rb @@ -904,6 +904,13 @@ class HasManyThroughAssociationsTest < ActiveRecord::TestCase      assert_match(/Couldn't find all Clients with 'name'/, e.message)    end +  def test_collection_singular_ids_through_setter_raises_exception_when_invalid_ids_set +    author = authors(:david) +    ids = [categories(:general).name, "Unknown"] +    e = assert_raises(ActiveRecord::RecordNotFound) { author.essay_category_ids = ids } +    assert_equal "Couldn't find all Categories with 'name': (General, Unknown) (found 1 results, but was looking for 2)", e.message +  end +    def test_build_a_model_from_hm_through_association_with_where_clause      assert_nothing_raised { books(:awdr).subscribers.where(nick: "marklazz").build }    end | 
