From 8a0228e2d43e3f54ac014c0edb2e8fe10bf97980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Ja=CC=88ger?= Date: Sun, 11 Sep 2022 10:24:58 +0200 Subject: [PATCH 1/2] include `table_name` in scopes to allow for JOIN operations --- .gitignore | 1 + lib/active_flag.rb | 10 +++++----- lib/active_flag/version.rb | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 0cb6eeb..0db92c8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /pkg/ /spec/reports/ /tmp/ +.idea diff --git a/lib/active_flag.rb b/lib/active_flag.rb index 3d70727..2981771 100644 --- a/lib/active_flag.rb +++ b/lib/active_flag.rb @@ -38,25 +38,25 @@ def flag(column, keys) options, integer, column_name = send "_where_#{column}", *args if options[:op] == :and ActiveSupport::Deprecation.warn('op: :and is deprecated, use where_all instead') - where("#{column_name} & #{integer} = #{integer}") + where("#{table_name}.#{column_name} & #{integer} = #{integer}") else - where("#{column_name} & #{integer} > 0") + where("#{table_name}.#{column_name} & #{integer} > 0") end end define_singleton_method "where_all_#{column}" do |*args| _options, integer, column_name = send "_where_#{column}", *args - where("#{column_name} & #{integer} = #{integer}") + where("#{table_name}.#{column_name} & #{integer} = #{integer}") end define_singleton_method "where_not_#{column}" do |*args| _options, integer, column_name = send "_where_#{column}", *args - where("#{column_name} & #{integer} = 0") + where("#{table_name}.#{column_name} & #{integer} = 0") end define_singleton_method "where_not_all_#{column}" do |*args| _options, integer, column_name = send "_where_#{column}", *args - where("#{column_name} & #{integer} < #{integer}") + where("#{table_name}.#{column_name} & #{integer} < #{integer}") end define_singleton_method "_where_#{column}" do |*args| diff --git a/lib/active_flag/version.rb b/lib/active_flag/version.rb index 65c7d34..bd39dda 100644 --- a/lib/active_flag/version.rb +++ b/lib/active_flag/version.rb @@ -1,3 +1,3 @@ module ActiveFlag - VERSION = '1.6.0' + VERSION = '1.7.0' end From 1a3e09fa0b46558ec10a00a22e8dccfa39f02eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Ja=CC=88ger?= Date: Tue, 3 Sep 2024 10:41:02 +0200 Subject: [PATCH 2/2] refactor and add test --- lib/active_flag.rb | 13 +++++++------ test/active_flag_test.rb | 10 ++++++++++ test/load_fixtures.rb | 20 ++++++++++++++++++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/active_flag.rb b/lib/active_flag.rb index 2981771..f82ec88 100644 --- a/lib/active_flag.rb +++ b/lib/active_flag.rb @@ -38,32 +38,33 @@ def flag(column, keys) options, integer, column_name = send "_where_#{column}", *args if options[:op] == :and ActiveSupport::Deprecation.warn('op: :and is deprecated, use where_all instead') - where("#{table_name}.#{column_name} & #{integer} = #{integer}") + where("#{column_name} & #{integer} = #{integer}") else - where("#{table_name}.#{column_name} & #{integer} > 0") + where("#{column_name} & #{integer} > 0") end end define_singleton_method "where_all_#{column}" do |*args| _options, integer, column_name = send "_where_#{column}", *args - where("#{table_name}.#{column_name} & #{integer} = #{integer}") + where("#{column_name} & #{integer} = #{integer}") end define_singleton_method "where_not_#{column}" do |*args| _options, integer, column_name = send "_where_#{column}", *args - where("#{table_name}.#{column_name} & #{integer} = 0") + where("#{column_name} & #{integer} = 0") end define_singleton_method "where_not_all_#{column}" do |*args| _options, integer, column_name = send "_where_#{column}", *args - where("#{table_name}.#{column_name} & #{integer} < #{integer}") + where("#{column_name} & #{integer} < #{integer}") end + # utility method to extract parameters define_singleton_method "_where_#{column}" do |*args| return [ args.extract_options!, active_flags[column].to_i(args), - connection.quote_table_name_for_assignment(table_name, column) + "#{connection.quote_table_name(table_name)}.#{connection.quote_column_name(column)}" ] end end diff --git a/test/active_flag_test.rb b/test/active_flag_test.rb index 0998d54..a0efd1b 100644 --- a/test/active_flag_test.rb +++ b/test/active_flag_test.rb @@ -128,4 +128,14 @@ def test_scope assert_equal Profile.where_not_languages(:chinese).count, 3 assert_equal Profile.where_not_all_languages(:chinese).count, 3 end + + def test_joining_tables + assert_equal Profile.joins(:users).where_languages(:english).count, 2 + assert_equal Profile.joins(:users).where_languages(:japanese).count, 1 + assert_equal Profile.joins(:users).where_languages(:chinese).count, 0 + + assert_equal User.joins(:profile).where(profile: Profile.where_languages(:english)).count, 2 + assert_equal User.joins(:profile).where(profile: Profile.where_languages(:japanese)).count, 1 + assert_equal User.joins(:profile).where(profile: Profile.where_languages(:chinese)).count, 0 + end end diff --git a/test/load_fixtures.rb b/test/load_fixtures.rb index 7525e91..7ddfc7b 100644 --- a/test/load_fixtures.rb +++ b/test/load_fixtures.rb @@ -9,12 +9,24 @@ t.integer :figures end +ActiveRecord::Base.connection.create_table :users, force: true do |t| + t.string :name, null: false + t.string :languages # to require table-specificity in SQL queries + t.integer :profile_id, null: false +end + class Profile < ActiveRecord::Base + has_many :users + flag :languages, [:english, :spanish, :chinese, :french, :japanese] flag :others, [:thing] flag :figures, [:square, :circle] end +class User < ActiveRecord::Base + belongs_to :profile +end + class SubProfile < Profile end @@ -22,6 +34,10 @@ class Other < ActiveRecord::Base flag :others, [:another] end -Profile.create(languages: [:english]) -Profile.create(languages: [:japanese]) +english_profile = Profile.create(languages: [:english]) +japanese_profile = Profile.create(languages: [:japanese]) Profile.create(languages: [:english, :japanese]) + +User.create(name: 'Prince Harry', profile: english_profile) +User.create(name: 'Queen Elizabeth', profile: english_profile) +User.create(name: 'Shigeru Myamoto', profile: japanese_profile)