mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #15078 from nbudin/fix_merger_filter_binds_comparison_master
Make filter_binds filter out symbols that are equal to strings Conflicts: activerecord/CHANGELOG.md
This commit is contained in:
commit
ec6bb33209
5 changed files with 32 additions and 1 deletions
|
@ -1,3 +1,12 @@
|
|||
* `ActiveRecord::Relation::Merger#filter_binds` now compares equivalent symbols and
|
||||
strings in column names as equal.
|
||||
|
||||
This fixes a rare case in which more bind values are passed than there are
|
||||
placeholders for them in the generated SQL statement, which can make PostgreSQL
|
||||
throw a `StatementInvalid` exception.
|
||||
|
||||
*Nat Budin*
|
||||
|
||||
* Fix `stored_attributes` to correctly merge the details of stored
|
||||
attributes defined in parent classes.
|
||||
|
||||
|
|
|
@ -156,7 +156,7 @@ module ActiveRecord
|
|||
def filter_binds(lhs_binds, removed_wheres)
|
||||
return lhs_binds if removed_wheres.empty?
|
||||
|
||||
set = Set.new removed_wheres.map { |x| x.left.name }
|
||||
set = Set.new removed_wheres.map { |x| x.left.name.to_s }
|
||||
lhs_binds.dup.delete_if { |col,_| set.include? col.name }
|
||||
end
|
||||
|
||||
|
|
|
@ -108,6 +108,11 @@ class RelationMergingTest < ActiveRecord::TestCase
|
|||
merged = left.merge(right)
|
||||
assert_equal post, merged.first
|
||||
end
|
||||
|
||||
def test_merging_compares_symbols_and_strings_as_equal
|
||||
post = PostThatLoadsCommentsInAnAfterSaveHook.create!(title: "First Post", body: "Blah blah blah.")
|
||||
assert_equal "First comment!", post.comments.where(body: "First comment!").first_or_create.body
|
||||
end
|
||||
end
|
||||
|
||||
class MergingDifferentRelationsTest < ActiveRecord::TestCase
|
||||
|
|
|
@ -40,3 +40,11 @@ end
|
|||
|
||||
class VerySpecialComment < Comment
|
||||
end
|
||||
|
||||
class CommentThatAutomaticallyAltersPostBody < Comment
|
||||
belongs_to :post, class_name: "PostThatLoadsCommentsInAnAfterSaveHook", foreign_key: :post_id
|
||||
|
||||
after_save do |comment|
|
||||
comment.post.update_attributes(body: "Automatically altered")
|
||||
end
|
||||
end
|
||||
|
|
|
@ -208,3 +208,12 @@ class SpecialPostWithDefaultScope < ActiveRecord::Base
|
|||
self.table_name = 'posts'
|
||||
default_scope { where(:id => [1, 5,6]) }
|
||||
end
|
||||
|
||||
class PostThatLoadsCommentsInAnAfterSaveHook < ActiveRecord::Base
|
||||
self.table_name = 'posts'
|
||||
has_many :comments, class_name: "CommentThatAutomaticallyAltersPostBody", foreign_key: :post_id
|
||||
|
||||
after_save do |post|
|
||||
post.comments.load
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue