diff options
author | Sean Griffin <sean@seantheprogrammer.com> | 2015-10-30 09:42:02 -0600 |
---|---|---|
committer | Sean Griffin <sean@seantheprogrammer.com> | 2015-10-30 09:42:02 -0600 |
commit | e038975c29aa883cb9ac5472cdb0ea9319158121 (patch) | |
tree | a07d201488caaa064aa290b3d91d66fcfd703aa3 /activerecord/test/cases/associations | |
parent | 67417f18215349cad990b1230ecf591b5509d557 (diff) | |
parent | 3f46ef1ddab87482b730a3f53987e04308783d8b (diff) | |
download | rails-e038975c29aa883cb9ac5472cdb0ea9319158121.tar.gz rails-e038975c29aa883cb9ac5472cdb0ea9319158121.tar.bz2 rails-e038975c29aa883cb9ac5472cdb0ea9319158121.zip |
Merge pull request #12071 from Crunch09/outer_joins
added ActiveRecord::Relation#outer_joins
Diffstat (limited to 'activerecord/test/cases/associations')
-rw-r--r-- | activerecord/test/cases/associations/left_outer_join_association_test.rb | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/activerecord/test/cases/associations/left_outer_join_association_test.rb b/activerecord/test/cases/associations/left_outer_join_association_test.rb new file mode 100644 index 0000000000..a362b43cc3 --- /dev/null +++ b/activerecord/test/cases/associations/left_outer_join_association_test.rb @@ -0,0 +1,74 @@ +require "cases/helper" +require 'models/post' +require 'models/comment' +require 'models/author' +require 'models/essay' +require 'models/categorization' +require 'models/person' + +class LeftOuterJoinAssociationTest < ActiveRecord::TestCase + fixtures :authors, :essays, :posts, :comments, :categorizations, :people + + def test_construct_finder_sql_applies_aliases_tables_on_association_conditions + result = Author.left_outer_joins(:thinking_posts, :welcome_posts).to_a + assert_equal authors(:david), result.first + end + + def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations + assert_nothing_raised do + sql = capture_sql do + Person.left_outer_joins(:agents => {:agents => :agents}) + .left_outer_joins(:agents => {:agents => {:primary_contact => :agents}}).to_a + end.first + assert_match(/agents_people_4/i, sql) + end + end + + def test_construct_finder_sql_executes_a_left_outer_join + assert_not_equal Author.count, Author.joins(:posts).count + assert_equal Author.count, Author.left_outer_joins(:posts).count + end + + def test_construct_finder_sql_ignores_empty_left_outer_joins_hash + sql = capture_sql { Author.left_outer_joins({}) }.first + assert_no_match(/LEFT OUTER JOIN/i, sql) + end + + def test_construct_finder_sql_ignores_empty_left_outer_joins_array + sql = capture_sql { Author.left_outer_joins([]) }.first + assert_no_match(/LEFT OUTER JOIN/i, sql) + end + + def test_left_outer_joins_forbids_to_use_string_as_argument + assert_raise(ArgumentError){ Author.left_outer_joins('LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"').to_a } + end + + def test_join_conditions_added_to_join_clause + sql = capture_sql { Author.left_outer_joins(:essays).to_a }.first + assert_match(/writer_type.*?=.*?(Author|\?|\$1)/i, sql) + assert_no_match(/WHERE/i, sql) + end + + def test_find_with_sti_join + scope = Post.left_outer_joins(:special_comments).where(:id => posts(:sti_comments).id) + + # The join should match SpecialComment and its subclasses only + assert scope.where("comments.type" => "Comment").empty? + assert !scope.where("comments.type" => "SpecialComment").empty? + assert !scope.where("comments.type" => "SubSpecialComment").empty? + end + + def test_does_not_override_select + authors = Author.select("authors.name, #{%{(authors.author_address_id || ' ' || authors.author_address_extra_id) as addr_id}}").left_outer_joins(:posts) + assert authors.any? + assert authors.first.respond_to?(:addr_id) + end + + test "the default scope of the target is applied when joining associations" do + author = Author.create! name: "Jon" + author.categorizations.create! + author.categorizations.create! special: true + + assert_equal [author], Author.where(id: author).left_outer_joins(:special_categorizations) + end +end |