Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

AssociationCollection#include? working properly for objects added wit…

…h build method [#3472 state:resolved]
  • Loading branch information...
commit 2221b701b4eff33e282f283c759b70789b122df3 1 parent fc1bd2b
@marklazz marklazz authored tenderlove committed
View
13 activerecord/lib/active_record/associations/association_collection.rb
@@ -363,6 +363,7 @@ def replace(other_array)
def include?(record)
return false unless record.is_a?(@reflection.klass)
+ return include_in_memory?(record) if record.new_record?
load_target if @reflection.options[:finder_sql] && !loaded?
return @target.include?(record) if loaded?
exists?(record)
@@ -554,6 +555,18 @@ def fetch_first_or_last_using_find?(args)
args.first.kind_of?(Hash) || !(loaded? || @owner.new_record? || @reflection.options[:finder_sql] ||
@target.any? { |record| record.new_record? } || args.first.kind_of?(Integer))
end
+
+ def include_in_memory?(record)
+ if @reflection.is_a?(ActiveRecord::Reflection::ThroughReflection)
+ @owner.send(proxy_reflection.through_reflection.name.to_sym).map do |source|
+ source_reflection_target = source.send(proxy_reflection.source_reflection.name)
+ return true if source_reflection_target.respond_to?(:include?) ? source_reflection_target.include?(record) : source_reflection_target == record
+ end
+ false
+ else
+ @target.include?(record)
+ end
+ end
end
end
end
View
6 activerecord/test/cases/associations/has_and_belongs_to_many_associations_test.rb
@@ -858,4 +858,10 @@ def test_attributes_are_being_set_when_initialized_from_habm_association_with_mu
assert_equal new_developer.name, "Marcelo"
assert_equal new_developer.salary, 90_000
end
+
+ def test_include_method_in_has_and_belongs_to_many_association_should_return_true_for_instance_added_with_build
+ project = Project.new
+ developer = project.developers.build
+ assert project.developers.include?(developer)
+ end
end
View
6 activerecord/test/cases/associations/has_many_associations_test.rb
@@ -1267,4 +1267,10 @@ def test_attributes_are_being_set_when_initialized_from_has_many_association_wit
assert_equal new_comment.type, "SpecialComment"
assert_equal new_comment.post_id, posts(:welcome).id
end
+
+ def test_include_method_in_has_many_association_should_return_true_for_instance_added_with_build
+ post = Post.new
+ comment = post.comments.build
+ assert post.comments.include?(comment)
+ end
end
View
14 activerecord/test/cases/associations/has_many_through_associations_test.rb
@@ -435,4 +435,18 @@ def test_attributes_are_being_set_when_initialized_from_hm_through_association_w
assert_equal new_subscriber.nick, "marklazz"
assert_equal new_subscriber.name, "Marcelo Giorgi"
end
+
+ def test_include_method_in_association_through_should_return_true_for_instance_added_with_build
+ person = Person.new
+ reference = person.references.build
+ job = reference.build_job
+ assert person.jobs.include?(job)
+ end
+
+ def test_include_method_in_association_through_should_return_true_for_instance_added_with_nested_builds
+ author = Author.new
+ post = author.posts.build
+ comment = post.comments.build
+ assert author.comments.include?(comment)
+ end
end
Please sign in to comment.
Something went wrong with that request. Please try again.