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..f82ec88 100644 --- a/lib/active_flag.rb +++ b/lib/active_flag.rb @@ -59,11 +59,12 @@ def flag(column, keys) 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/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 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)