has_normalized_sti 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -9,6 +9,6 @@ end
9
9
  group :test do
10
10
  gem 'rspec'
11
11
  gem 'rspec-rails'
12
- gem 'activerecord', '~> 3.0.0'
12
+ gem 'activerecord', '>= 3.0.0'
13
13
  gem 'sqlite3'
14
14
  end
data/Rakefile CHANGED
@@ -4,10 +4,12 @@ begin
4
4
  gem.name = 'has_normalized_sti'
5
5
  gem.summary = 'allows rails STI to work when the type is normalized out'
6
6
  gem.description = <<-DESC
7
- has_normalzied_sti expects the model to have a type_id column
8
- referencing a types table containg all the possible types.
9
- the types table will be auto populated with new types as new
10
- subclasses are saved
7
+ has_normalzied_sti is a rails extension to allow Single Table Inheritance
8
+ to work with a database normalized type column.
9
+ The extension expects the STI model to have a type_id column instead of
10
+ a type column. type_id should reference a Types table containg all the possible types.
11
+ The types table will be auto populated with new types as new
12
+ subclasses are saved.
11
13
  DESC
12
14
  gem.email = 'kevin@glowacz.info'
13
15
  gem.author = 'Kevin Glowacz'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.0
1
+ 1.1.0
@@ -5,15 +5,17 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{has_normalized_sti}
8
- s.version = "1.0.0"
8
+ s.version = "1.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Kevin Glowacz"]
12
- s.date = %q{2011-06-24}
13
- s.description = %q{ has_normalzied_sti expects the model to have a type_id column
14
- referencing a types table containg all the possible types.
15
- the types table will be auto populated with new types as new
16
- subclasses are saved
11
+ s.authors = [%q{Kevin Glowacz}]
12
+ s.date = %q{2011-09-20}
13
+ s.description = %q{ has_normalzied_sti is a rails extension to allow Single Table Inheritance
14
+ to work with a database normalized type column.
15
+ The extension expects the STI model to have a type_id column instead of
16
+ a type column. type_id should reference a Types table containg all the possible types.
17
+ The types table will be auto populated with new types as new
18
+ subclasses are saved.
17
19
  }
18
20
  s.email = %q{kevin@glowacz.info}
19
21
  s.extra_rdoc_files = [
@@ -22,7 +24,6 @@ Gem::Specification.new do |s|
22
24
  s.files = [
23
25
  ".rspec",
24
26
  "Gemfile",
25
- "Gemfile.lock",
26
27
  "README",
27
28
  "Rakefile",
28
29
  "VERSION",
@@ -34,8 +35,8 @@ Gem::Specification.new do |s|
34
35
  "spec/spec_helper.rb",
35
36
  "spec/speed_test.rb"
36
37
  ]
37
- s.require_paths = ["lib"]
38
- s.rubygems_version = %q{1.6.2}
38
+ s.require_paths = [%q{lib}]
39
+ s.rubygems_version = %q{1.8.6}
39
40
  s.summary = %q{allows rails STI to work when the type is normalized out}
40
41
 
41
42
  if s.respond_to? :specification_version then
@@ -39,7 +39,7 @@ module HasNormalizedSti
39
39
  extend HasNormalizedSti::SingletonMethods
40
40
  include HasNormalizedSti::InstanceMethods
41
41
 
42
- class_inheritable_accessor :sti_config
42
+ class_attribute :sti_config
43
43
  self.sti_config = {
44
44
  :type_class_name => "#{table_name.classify}Type",
45
45
  :foreign_key => 'type_id',
@@ -62,48 +62,26 @@ module HasNormalizedSti
62
62
  default_scope joins(:normal_type).select("#{table_name}.*, #{sti_config[:type_class_name].constantize.table_name}.#{sti_config[:type_column]}")
63
63
  validates_associated :normal_type
64
64
  validates_presence_of :normal_type
65
+ set_inheritance_column 'has_normalized_sti_proxy_type'
65
66
  end
66
67
  end
67
68
 
68
69
  module SingletonMethods
69
- def instantiate(record)
70
- if record.has_key?(sti_config[:type_column])
71
- type_name = record[sti_config[:type_column]]
72
- else
73
- associated_record = sti_config[:type_class_name].constantize.find_by_id(record[sti_config[:foreign_key].to_s])
74
- type_name = associated_record.try(sti_config[:type_column])
75
- end
76
- model = find_sti_class(type_name).allocate
77
- model.init_with('attributes' => record)
78
- model
70
+ def columns_hash
71
+ ch = super
72
+ # AR will only do its magic if it thinks the db table has the inheritance_column
73
+ ch[inheritance_column] = nil
74
+ ch
79
75
  end
80
76
 
81
- def find_sti_class(type_name)
82
- if type_name.blank?
83
- self
84
- else
85
- begin
86
- if store_full_sti_class
87
- ActiveSupport::Dependencies.constantize(type_name)
88
- else
89
- compute_type(type_name)
90
- end
91
- rescue NameError
92
- raise SubclassNotFound,
93
- "The single-table inheritance mechanism failed to locate the subclass: '#{type_name}'. " +
94
- "This error is raised because the column '#{inheritance_column}' is reserved for storing the class in case of inheritance. " +
95
- "Please rename this column if you didn't intend it to be used for storing the inheritance class " +
96
- "or overwrite #{name}.inheritance_column to use another column for that information."
97
- end
98
- end
99
- end
77
+ # look up the type name on the associated object
78
+ # put in in the record's inheritance_column to trick AR
79
+ def instantiate(record)
80
+ associated_record = sti_config[:type_class_name].constantize.find_by_id(record[sti_config[:foreign_key].to_s])
81
+ type_name = associated_record.try(sti_config[:type_column])
82
+ record[inheritance_column] = type_name
100
83
 
101
- def descends_from_active_record?
102
- if superclass.abstract_class?
103
- superclass.descends_from_active_record?
104
- else
105
- superclass == ActiveRecord::Base
106
- end
84
+ super
107
85
  end
108
86
 
109
87
  def type_condition
@@ -116,7 +94,7 @@ module HasNormalizedSti
116
94
  end
117
95
 
118
96
  module InstanceMethods
119
- def initialize(attributes = {})
97
+ def initialize(*args)
120
98
  super
121
99
  self.type = self.class.to_s
122
100
  end
metadata CHANGED
@@ -1,63 +1,62 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: has_normalized_sti
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
4
5
  prerelease:
5
- version: 1.0.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Kevin Glowacz
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2011-06-24 00:00:00 -05:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
12
+ date: 2011-09-20 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
17
15
  name: jeweler
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2153251520 !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
21
- - - ">="
22
- - !ruby/object:Gem::Version
23
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
24
22
  type: :development
25
23
  prerelease: false
26
- version_requirements: *id001
27
- - !ruby/object:Gem::Dependency
24
+ version_requirements: *2153251520
25
+ - !ruby/object:Gem::Dependency
28
26
  name: mocha
29
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ requirement: &2153251000 !ruby/object:Gem::Requirement
30
28
  none: false
31
- requirements:
32
- - - ">="
33
- - !ruby/object:Gem::Version
34
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
35
33
  type: :development
36
34
  prerelease: false
37
- version_requirements: *id002
38
- - !ruby/object:Gem::Dependency
35
+ version_requirements: *2153251000
36
+ - !ruby/object:Gem::Dependency
39
37
  name: i18n
40
- requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirement: &2153250480 !ruby/object:Gem::Requirement
41
39
  none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
46
44
  type: :development
47
45
  prerelease: false
48
- version_requirements: *id003
49
- description: " has_normalzied_sti expects the model to have a type_id column\n referencing a types table containg all the possible types.\n the types table will be auto populated with new types as new\n subclasses are saved\n"
46
+ version_requirements: *2153250480
47
+ description: ! " has_normalzied_sti is a rails extension to allow Single Table
48
+ Inheritance\n to work with a database normalized type column.\n The extension
49
+ expects the STI model to have a type_id column instead of\n a type column.
50
+ type_id should reference a Types table containg all the possible types.\n The
51
+ types table will be auto populated with new types as new\n subclasses are saved.\n"
50
52
  email: kevin@glowacz.info
51
53
  executables: []
52
-
53
54
  extensions: []
54
-
55
- extra_rdoc_files:
55
+ extra_rdoc_files:
56
56
  - README
57
- files:
57
+ files:
58
58
  - .rspec
59
59
  - Gemfile
60
- - Gemfile.lock
61
60
  - README
62
61
  - Rakefile
63
62
  - VERSION
@@ -68,36 +67,28 @@ files:
68
67
  - spec/schema.rb
69
68
  - spec/spec_helper.rb
70
69
  - spec/speed_test.rb
71
- has_rdoc: true
72
70
  homepage:
73
71
  licenses: []
74
-
75
72
  post_install_message:
76
73
  rdoc_options: []
77
-
78
- require_paths:
74
+ require_paths:
79
75
  - lib
80
- required_ruby_version: !ruby/object:Gem::Requirement
76
+ required_ruby_version: !ruby/object:Gem::Requirement
81
77
  none: false
82
- requirements:
83
- - - ">="
84
- - !ruby/object:Gem::Version
85
- hash: 3468596275297658209
86
- segments:
87
- - 0
88
- version: "0"
89
- required_rubygems_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
83
  none: false
91
- requirements:
92
- - - ">="
93
- - !ruby/object:Gem::Version
94
- version: "0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
95
88
  requirements: []
96
-
97
89
  rubyforge_project:
98
- rubygems_version: 1.6.2
90
+ rubygems_version: 1.8.6
99
91
  signing_key:
100
92
  specification_version: 3
101
93
  summary: allows rails STI to work when the type is normalized out
102
94
  test_files: []
103
-
data/Gemfile.lock DELETED
@@ -1,75 +0,0 @@
1
- GEM
2
- remote: http://rubygems.org/
3
- specs:
4
- abstract (1.0.0)
5
- actionpack (3.0.8)
6
- activemodel (= 3.0.8)
7
- activesupport (= 3.0.8)
8
- builder (~> 2.1.2)
9
- erubis (~> 2.6.6)
10
- i18n (~> 0.5.0)
11
- rack (~> 1.2.1)
12
- rack-mount (~> 0.6.14)
13
- rack-test (~> 0.5.7)
14
- tzinfo (~> 0.3.23)
15
- activemodel (3.0.8)
16
- activesupport (= 3.0.8)
17
- builder (~> 2.1.2)
18
- i18n (~> 0.5.0)
19
- activerecord (3.0.8)
20
- activemodel (= 3.0.8)
21
- activesupport (= 3.0.8)
22
- arel (~> 2.0.10)
23
- tzinfo (~> 0.3.23)
24
- activesupport (3.0.8)
25
- arel (2.0.10)
26
- builder (2.1.2)
27
- diff-lcs (1.1.2)
28
- erubis (2.6.6)
29
- abstract (>= 1.0.0)
30
- git (1.2.5)
31
- i18n (0.5.0)
32
- jeweler (1.6.2)
33
- bundler (~> 1.0)
34
- git (>= 1.2.5)
35
- rake
36
- mocha (0.9.12)
37
- rack (1.2.3)
38
- rack-mount (0.6.14)
39
- rack (>= 1.0.0)
40
- rack-test (0.5.7)
41
- rack (>= 1.0)
42
- railties (3.0.8)
43
- actionpack (= 3.0.8)
44
- activesupport (= 3.0.8)
45
- rake (>= 0.8.7)
46
- thor (~> 0.14.4)
47
- rake (0.9.2)
48
- rspec (2.6.0)
49
- rspec-core (~> 2.6.0)
50
- rspec-expectations (~> 2.6.0)
51
- rspec-mocks (~> 2.6.0)
52
- rspec-core (2.6.4)
53
- rspec-expectations (2.6.0)
54
- diff-lcs (~> 1.1.2)
55
- rspec-mocks (2.6.0)
56
- rspec-rails (2.6.1)
57
- actionpack (~> 3.0)
58
- activesupport (~> 3.0)
59
- railties (~> 3.0)
60
- rspec (~> 2.6.0)
61
- sqlite3 (1.3.3)
62
- thor (0.14.6)
63
- tzinfo (0.3.28)
64
-
65
- PLATFORMS
66
- ruby
67
-
68
- DEPENDENCIES
69
- activerecord (~> 3.0.0)
70
- i18n
71
- jeweler
72
- mocha
73
- rspec
74
- rspec-rails
75
- sqlite3