Skip to content

Commit

Permalink
fix code , refactoring and test
Browse files Browse the repository at this point in the history
  • Loading branch information
Neeraj Singh committed Jul 1, 2011
1 parent 58b778f commit 5b1a025
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 5 deletions.
19 changes: 19 additions & 0 deletions lib/admin_data/active_record_util.rb
Expand Up @@ -85,6 +85,25 @@ def has_association_info?
declared_habtm_association_names.any?
end

# class User
# has_many :comments
# end
#
# class Car
# has_many :brakes, :foreign_key => 'vehicle_id'
# end
#
# ActiveRecordUtil.foreign_key_for_has_many(User, :comments)
# #=> user_id
#
# ActiveRecordUtil.foreign_key_for_has_many(Car, :brakes)
# #=> vehicle_id
#
def self.foreign_key_for_has_many(klass, relationship_name)
fk = klass.reflections[relationship_name].instance_variable_get('@options')[:foreign_key]
fk || klass.reflections[relationship_name].instance_variable_get('@active_record').name.foreign_key
end

private

# returns declared association names like
Expand Down
8 changes: 3 additions & 5 deletions lib/admin_data/analytics/hm_association.rb
Expand Up @@ -13,14 +13,13 @@ def initialize(main_klass, hm_klass, hm_relationship_name)
end

def count_of_main_klass_records_not_in_hm_klass
foreign_key = main_klass.reflections[hm_relationship_name].instance_variable_get('@active_record').name.foreign_key
raise 'foreign_key is nil' unless foreign_key
foreign_key = AdminData::ActiveRecordUtil.foreign_key_for_has_many(main_klass, hm_relationship_name)

sql = %Q{
select count(*) as count_data
from #{main_klass.table_name}
where users.id NOT IN (
where #{main_klass.table_name}.id NOT IN (
select #{hm_klass.table_name}.#{foreign_key}
from #{hm_klass.table_name}
)
Expand All @@ -31,8 +30,7 @@ def count_of_main_klass_records_not_in_hm_klass
end

def count_of_main_klass_records_in_hm_klass(count = nil)
foreign_key = main_klass.reflections[hm_relationship_name].instance_variable_get('@active_record').name.foreign_key
raise 'foreign_key is nil' unless foreign_key
foreign_key = AdminData::ActiveRecordUtil.foreign_key_for_has_many(main_klass, hm_relationship_name)

having_sql = if count
"having count(#{hm_klass.table_name}.id) = #{count}"
Expand Down
3 changes: 3 additions & 0 deletions test/rails_root/app/models/brake.rb
@@ -0,0 +1,3 @@
class Brake < ActiveRecord::Base
belongs_to :car
end
1 change: 1 addition & 0 deletions test/rails_root/app/models/car.rb
@@ -1,3 +1,4 @@
class Car < ActiveRecord::Base
belongs_to :user
has_many :brakes, :foreign_key => 'vehicle_id'
end
6 changes: 6 additions & 0 deletions test/rails_root/db/migrate/20091030202259_create_tables.rb
@@ -1,6 +1,12 @@
class CreateTables < ActiveRecord::Migration
def self.up

create_table :brakes do |t|
t.string :color
t.integer :vehicle_id
t.timestamps
end

create_table :cars do |t|
t.string :name
t.integer :user_id
Expand Down
17 changes: 17 additions & 0 deletions test/rails_root/test/unit/active_record_util_test.rb
@@ -0,0 +1,17 @@
require "test_helper"
require "minitest/autorun"

class ActiveRecordUtilTest < MiniTest::Unit::TestCase

def test_foreign_key_for_has_many_for_standard_case
result = AdminData::ActiveRecordUtil.foreign_key_for_has_many(User, :phone_numbers)
assert_equal 'user_id', result
end

def test_foreign_key_for_has_many_for_non_standard_case
result = AdminData::ActiveRecordUtil.foreign_key_for_has_many(Car, :brakes)
assert_equal 'vehicle_id', result
end

end

0 comments on commit 5b1a025

Please sign in to comment.