numeric_type_column 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/Rakefile +2 -0
  2. data/lib/numeric_type_column/active_record/{base_extension.rb → base_patch.rb} +3 -3
  3. data/lib/numeric_type_column/active_record/{belongs_to_polymorphic_association_extension.rb → belongs_to_polymorphic_association_patch.rb} +4 -4
  4. data/lib/numeric_type_column/active_record/{column_definition_extension.rb → column_definition_patch.rb} +4 -4
  5. data/lib/numeric_type_column/active_record/mysql_adapter_patch.rb +102 -0
  6. data/lib/numeric_type_column/active_record/schema_dumper_patch.rb +102 -0
  7. data/lib/numeric_type_column/active_record/{table_definition_extension.rb → table_definition_patch.rb} +3 -3
  8. data/lib/numeric_type_column/active_record.rb +8 -5
  9. data/lib/numeric_type_column/railtie.rb +11 -5
  10. data/lib/numeric_type_column/version.rb +1 -1
  11. data/test/dummy/README.rdoc +261 -0
  12. data/test/dummy/Rakefile +7 -0
  13. data/test/dummy/app/assets/javascripts/application.js +15 -0
  14. data/test/dummy/app/assets/javascripts/unsigned_columns_tests.js +2 -0
  15. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  16. data/test/dummy/app/assets/stylesheets/scaffold.css +56 -0
  17. data/test/dummy/app/assets/stylesheets/unsigned_columns_tests.css +4 -0
  18. data/test/dummy/app/controllers/application_controller.rb +3 -0
  19. data/test/dummy/app/controllers/unsigned_columns_tests_controller.rb +83 -0
  20. data/test/dummy/app/helpers/application_helper.rb +2 -0
  21. data/test/dummy/app/helpers/unsigned_columns_tests_helper.rb +2 -0
  22. data/test/dummy/app/models/unsigned_columns_test.rb +4 -0
  23. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  24. data/test/dummy/app/views/unsigned_columns_tests/_form.html.erb +37 -0
  25. data/test/dummy/app/views/unsigned_columns_tests/edit.html.erb +6 -0
  26. data/test/dummy/app/views/unsigned_columns_tests/index.html.erb +31 -0
  27. data/test/dummy/app/views/unsigned_columns_tests/new.html.erb +5 -0
  28. data/test/dummy/app/views/unsigned_columns_tests/show.html.erb +30 -0
  29. data/test/dummy/config/application.rb +59 -0
  30. data/test/dummy/config/boot.rb +10 -0
  31. data/test/dummy/config/database.yml +30 -0
  32. data/test/dummy/config/environment.rb +5 -0
  33. data/test/dummy/config/environments/development.rb +37 -0
  34. data/test/dummy/config/environments/mayhem.rb +37 -0
  35. data/test/dummy/config/environments/production.rb +67 -0
  36. data/test/dummy/config/environments/test.rb +37 -0
  37. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  38. data/test/dummy/config/initializers/inflections.rb +15 -0
  39. data/test/dummy/config/initializers/mime_types.rb +5 -0
  40. data/test/dummy/config/initializers/secret_token.rb +7 -0
  41. data/test/dummy/config/initializers/session_store.rb +8 -0
  42. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  43. data/test/dummy/config/locales/en.yml +5 -0
  44. data/test/dummy/config/routes.rb +60 -0
  45. data/test/dummy/config.ru +4 -0
  46. data/test/dummy/db/migrate/20121024034824_create_unsigned_columns_tests.rb +40 -0
  47. data/test/dummy/db/migrate/20121024090232_create_join_table_test.rb +19 -0
  48. data/test/dummy/db/schema.rb +38 -0
  49. data/test/dummy/db/seeds.rb +20 -0
  50. data/test/dummy/log/mayhem.log +1513 -0
  51. data/test/dummy/public/404.html +26 -0
  52. data/test/dummy/public/422.html +26 -0
  53. data/test/dummy/public/500.html +25 -0
  54. data/test/dummy/public/favicon.ico +0 -0
  55. data/test/dummy/script/rails +6 -0
  56. data/test/dummy/test/fixtures/unsigned_columns_tests.yml +15 -0
  57. data/test/dummy/test/functional/unsigned_columns_tests_controller_test.rb +49 -0
  58. data/test/dummy/test/unit/helpers/unsigned_columns_tests_helper_test.rb +4 -0
  59. data/test/dummy/test/unit/unsigned_columns_test_test.rb +7 -0
  60. data/test/numeric_type_column_test.rb +7 -0
  61. data/test/test_helper.rb +15 -0
  62. metadata +130 -10
  63. data/lib/numeric_type_column/active_record/abstract_mysql_adapter_extension.rb +0 -69
data/Rakefile CHANGED
@@ -20,6 +20,8 @@ RDoc::Task.new(:rdoc) do |rdoc|
20
20
  rdoc.rdoc_files.include('lib/**/*.rb')
21
21
  end
22
22
 
23
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
24
+ load 'rails/tasks/engine.rake'
23
25
 
24
26
 
25
27
 
@@ -4,7 +4,7 @@ module NumericTypeColumn
4
4
 
5
5
  module ActiveRecord
6
6
 
7
- module BaseExtension
7
+ module BasePatch
8
8
 
9
9
  # http://yehudakatz.com/2009/11/12/better-ruby-idioms/
10
10
 
@@ -24,7 +24,7 @@ module NumericTypeColumn
24
24
 
25
25
  # ActiveRecord::Inheritance::ClassMethods#find_sti_class
26
26
  def find_sti_class(type_id)
27
- puts "(MonkeyPatch) NumericTypeColumn::ActiveRecord::BaseExtension: find_sti_class(type_id: #{type_id} )... #{base_class.inheritance_map.inspect}"
27
+ # puts "(MonkeyPatch) NumericTypeColumn::ActiveRecord::BasePatch: find_sti_class(type_id: #{type_id} )... #{base_class.inheritance_map.inspect}"
28
28
  base_class.inheritance_map[type_id].constantize
29
29
  end
30
30
 
@@ -61,7 +61,7 @@ module NumericTypeColumn
61
61
  # Setear el atributo de inheritance_column:
62
62
  send("#{self.class.inheritance_column.to_sym}=", self.class.base_class.inheritance_map.key(self.class.sti_name))
63
63
 
64
- raise ReadOnlyRecord if readonly?
64
+ raise ActiveRecord::ReadOnlyRecord if readonly?
65
65
  result = new_record? ? create : update
66
66
  result != false
67
67
  end
@@ -3,17 +3,17 @@
3
3
  module NumericTypeColumn
4
4
  module ActiveRecord
5
5
 
6
- module BelongsToPolymorphicAssociationExtension
6
+ module BelongsToPolymorphicAssociationPatch
7
7
 
8
8
  def self.included(base)
9
- #puts "NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationExtension included to #{base.name}!"
9
+ #puts "NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationPatch included to #{base.name}!"
10
10
  base.send :alias_method_chain, :klass, :numeric_type_column
11
11
  base.send :alias_method_chain, :replace_keys, :numeric_type_column
12
12
  end
13
13
 
14
14
  def klass_with_numeric_type_column
15
15
 
16
- #puts "NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationExtension: klass_with_numeric_type_column"
16
+ #puts "NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationPatch: klass_with_numeric_type_column"
17
17
 
18
18
  type = owner[reflection.foreign_type]
19
19
 
@@ -27,7 +27,7 @@ module NumericTypeColumn
27
27
 
28
28
  def replace_keys_with_numeric_type_column(record)
29
29
 
30
- #puts "NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationExtension: replace_keys_with_numeric_type_column(record: #{record})"
30
+ #puts "NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationPatch: replace_keys_with_numeric_type_column(record: #{record})"
31
31
 
32
32
  super
33
33
  if owner.attribute_names.include?(reflection.foreign_type)
@@ -6,19 +6,19 @@ module NumericTypeColumn
6
6
  module ActiveRecord
7
7
 
8
8
  # Basado en http://thewebfellas.com/blog/2008/6/2/unsigned-integers-for-mysql-on-rails
9
- module ColumnDefinitionExtension
9
+ module ColumnDefinitionPatch
10
10
 
11
11
  attr_accessor :unsigned, :comment
12
12
 
13
13
  def self.included(base)
14
- #puts "NumericTypeColumn::ActiveRecord::ColumnDefinitionExtension included to #{base.name}!"
14
+ #puts "NumericTypeColumn::ActiveRecord::ColumnDefinitionPatch included to #{base.name}!"
15
15
  base.send :alias_method_chain, :sql_type, :unsigned
16
16
  base.send :alias_method_chain, :to_sql, :extra_options
17
17
  end
18
18
 
19
19
  # Override de #sql_type
20
20
  def sql_type_with_unsigned
21
- #puts "NumericTypeColumn::ActiveRecord::ColumnDefinitionExtension: sql_type_with_unsigned"
21
+ #puts "NumericTypeColumn::ActiveRecord::ColumnDefinitionPatch: sql_type_with_unsigned"
22
22
  # Cambio: signature de call base.type_to_sql:
23
23
  if base.method(:type_to_sql).parameters.include?([:opt, :unsigned])
24
24
  base.type_to_sql(type.to_sym, limit, precision, scale, unsigned) rescue type
@@ -30,7 +30,7 @@ module NumericTypeColumn
30
30
 
31
31
  # Override de #to_sql
32
32
  def to_sql_with_extra_options
33
- #puts "NumericTypeColumn::ActiveRecord::ColumnDefinitionExtension: to_sql_with_extra_options"
33
+ #puts "NumericTypeColumn::ActiveRecord::ColumnDefinitionPatch: to_sql_with_extra_options"
34
34
  column_sql = "#{base.quote_column_name(name)} #{sql_type}"
35
35
  column_options = {}
36
36
  column_options[:null] = null unless null.nil?
@@ -0,0 +1,102 @@
1
+ # encoding: utf-8
2
+
3
+ module NumericTypeColumn
4
+
5
+ module ActiveRecord
6
+
7
+ module MysqlColumnPatch
8
+
9
+ def self.included(base)
10
+ #puts "NumericTypeColumn::ActiveRecord::MysqlColumnPatch included to #{base.name}!"
11
+ base.send :alias_method_chain, :initialize, :comment
12
+ end
13
+
14
+ attr_reader :comment
15
+
16
+ def initialize_with_comment(name, default, sql_type = nil, null = true, collation = nil, comment = nil)
17
+ # puts "NumericTypeColumn::ActiveRecord::MysqlColumnPatch#initialize_with_comment - comment: #{comment}"
18
+ initialize_without_comment(name, default, sql_type, null, collation)
19
+ @comment = comment if comment.present?
20
+ end
21
+
22
+ end
23
+
24
+ module MysqlAdapterPatch
25
+
26
+ def self.included(base)
27
+ #puts "NumericTypeColumn::ActiveRecord::MysqlAdapterPatch included to #{base.name}!"
28
+ base::NATIVE_DATABASE_TYPES[:primary_key] = 'INT UNSIGNED DEFAULT NULL auto_increment PRIMARY KEY'
29
+ base.send :alias_method_chain, :add_column_sql, :unsigned
30
+ base.send :alias_method_chain, :type_to_sql, :unsigned
31
+ base.send :alias_method_chain, :add_column_options!, :comment
32
+ base.send :alias_method_chain, :columns, :comment
33
+ base.send :alias_method_chain, :new_column, :comment
34
+ #base.send :alias_method_chain, :create_table, :mysql_options
35
+
36
+ # Incluir patch a self::Column:
37
+ "#{base.name}::Column".constantize.send :include, NumericTypeColumn::ActiveRecord::MysqlColumnPatch
38
+ end
39
+
40
+ =begin
41
+ def create_table_with_mysql_options(table_name, options = {}) #:nodoc:
42
+ puts "NumericTypeColumn::ActiveRecord::MysqlAdapterPatch: create_table(table_name: #{table_name}, options: #{options})"
43
+ create_table_without_mysql_options(table_name, options.reverse_merge(options: options[:mysql_options] ? options[:mysql_options] : "ENGINE=InnoDB"))
44
+ end
45
+ =end
46
+ def new_column_with_comment(field, default, type, null, collation, comment) # :nodoc:
47
+ #puts "NumericTypeColumn::ActiveRecord::MysqlAdapterPatch#new_column_with_comment: '#{comment}'"
48
+ "#{self.class.name}::Column".constantize.new(field, default, type, null, collation, comment)
49
+ end
50
+
51
+ def table_options(table_name)
52
+ sql = "SHOW TABLE STATUS "
53
+ sql << "IN #{quote_table_name(current_database)} "
54
+ sql << "LIKE #{quote(table_name)}"
55
+ ohmy = execute_and_free(sql, 'SCHEMA') do |result|
56
+ each_hash(result).map do |field|
57
+ "ENGINE=#{field[:Engine]} COLLATE=#{field[:Collation]} COMMENT='#{field[:Comment]}'"
58
+ end
59
+ end
60
+ ohmy.first
61
+ end
62
+
63
+ # Returns an array of +Column+ objects for the table specified by +table_name+.
64
+ def columns_with_comment(table_name, name = nil)#:nodoc:
65
+ sql = "SHOW FULL FIELDS FROM #{quote_table_name(table_name)}"
66
+ execute_and_free(sql, 'SCHEMA') do |result|
67
+ each_hash(result).map do |field|
68
+ new_column_with_comment(field[:Field], field[:Default], field[:Type], field[:Null] == "YES", field[:Collation], field[:Comment])
69
+ end
70
+ end
71
+ end
72
+
73
+ protected
74
+
75
+ def add_column_sql_with_unsigned(table_name, column_name, type, options = {})
76
+ #puts "NumericTypeColumn::ActiveRecord::MysqlAdapterPatch: add_column_sql_with_unsigned(table_name: #{table_name}, column_name: #{column_name}, type: #{type}, options: #{options})"
77
+ is_unsigned_valid = (((options.has_key? :unsigned) && (options[:unsigned] == true)) && (['integer', 'decimal', 'float', 'boolean'].include? type.to_s))
78
+ add_column_sql = "ADD #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale], is_unsigned_valid)}"
79
+ add_column_options!(add_column_sql, options)
80
+ add_column_position!(add_column_sql, options)
81
+ add_column_sql
82
+ end
83
+
84
+ def type_to_sql_with_unsigned(type, limit = nil, precision = nil, scale = nil, unsigned = false)
85
+ #puts "NumericTypeColumn::ActiveRecord::MysqlAdapterPatch: type_to_sql_with_unsigned(type: #{type}, limit: #{limit}, precision: #{precision}, scale: #{scale}, unsigned: #{unsigned})..."
86
+ sql = type_to_sql_without_unsigned(type, limit, precision, scale)
87
+ sql << ' UNSIGNED' if unsigned && (['integer', 'decimal', 'float', 'boolean'].include? type.to_s)
88
+ sql
89
+ end
90
+
91
+ def add_column_options_with_comment!(sql, options = {})
92
+ #puts "NumericTypeColumn::ActiveRecord::MysqlAdapterPatch: add_column_options_with_comment!(sql: #{sql}, options: #{})"
93
+ add_column_options_without_comment!(sql, options)
94
+ sql << " COMMENT '#{options[:comment]}'" if options[:comment]
95
+ sql
96
+ end
97
+
98
+ end
99
+
100
+ end
101
+
102
+ end
@@ -0,0 +1,102 @@
1
+ module NumericTypeColumn
2
+ module ActiveRecord
3
+ module SchemaDumperPatch
4
+
5
+ def self.included(base)
6
+ #puts "NumericTypeColumn::ActiveRecord::SchemaDumperPatch included to #{base.name}!"
7
+ base.send :alias_method_chain, :table, :unsigned_and_comment
8
+ end
9
+
10
+ # Override de #table
11
+ def table_with_unsigned_and_comment(table, stream)
12
+ columns = @connection.columns(table)
13
+
14
+ begin
15
+ tbl = StringIO.new
16
+
17
+ # first dump primary key column
18
+ if @connection.respond_to?(:pk_and_sequence_for)
19
+ pk, _ = @connection.pk_and_sequence_for(table)
20
+ elsif @connection.respond_to?(:primary_key)
21
+ pk = @connection.primary_key(table)
22
+ end
23
+
24
+ tbl.print " create_table #{remove_prefix_and_suffix(table).inspect}"
25
+ if columns.detect { |c| c.name == pk }
26
+ if pk != 'id'
27
+ tbl.print %Q(, :primary_key => "#{pk}")
28
+ end
29
+ else
30
+ tbl.print ", :id => false"
31
+ end
32
+ tbl.print ", :force => true"
33
+ tbl.print ", :options =>\"#{@connection.table_options(table)}\""
34
+ tbl.puts " do |t|"
35
+
36
+ # then dump all non-primary key columns
37
+ column_specs = columns.map do |column|
38
+ raise StandardError, "Unknown type '#{column.sql_type}' for column '#{column.name}'" if @types[column.type].nil?
39
+ next if column.name == pk
40
+ spec = {}
41
+ spec[:name] = column.name.inspect
42
+
43
+ # AR has an optimization which handles zero-scale decimals as integers. This
44
+ # code ensures that the dumper still dumps the column as a decimal.
45
+ spec[:type] = if column.type == :integer && [/^numeric/, /^decimal/].any? { |e| e.match(column.sql_type) }
46
+ 'decimal'
47
+ else
48
+ column.type.to_s
49
+ end
50
+ spec[:unsigned] = 'true' if /unsigned/i.match(column.sql_type)
51
+ spec[:limit] = column.limit.inspect if column.limit != @types[column.type][:limit] && spec[:type] != 'decimal'
52
+ spec[:precision] = column.precision.inspect if column.precision
53
+ spec[:scale] = column.scale.inspect if column.scale
54
+ spec[:null] = 'false' unless column.null
55
+ spec[:default] = default_string(column.default) if column.has_default?
56
+ spec[:comment] = "\"#{column.comment}\"" unless column.comment.nil?
57
+ (spec.keys - [:name, :type]).each{ |k| spec[k].insert(0, "#{k.inspect} => ")}
58
+ spec
59
+ end.compact
60
+
61
+ # find all migration keys used in this table
62
+ keys = [:name, :limit, :unsigned, :precision, :scale, :default, :null, :comment] & column_specs.map{ |k| k.keys }.flatten
63
+
64
+ # figure out the lengths for each column based on above keys
65
+ lengths = keys.map{ |key| column_specs.map{ |spec| spec[key] ? spec[key].length + 2 : 0 }.max }
66
+
67
+ # the string we're going to sprintf our values against, with standardized column widths
68
+ format_string = lengths.map{ |len| "%-#{len}s" }
69
+
70
+ # find the max length for the 'type' column, which is special
71
+ type_length = column_specs.map{ |column| column[:type].length }.max
72
+
73
+ # add column type definition to our format string
74
+ format_string.unshift " t.%-#{type_length}s "
75
+
76
+ format_string *= ''
77
+
78
+ column_specs.each do |colspec|
79
+ values = keys.zip(lengths).map{ |key, len| colspec.key?(key) ? colspec[key] + ", " : " " * len }
80
+ values.unshift colspec[:type]
81
+ tbl.print((format_string % values).gsub(/,\s*$/, ''))
82
+ tbl.puts
83
+ end
84
+
85
+ tbl.puts " end"
86
+ tbl.puts
87
+
88
+ indexes(table, tbl)
89
+
90
+ tbl.rewind
91
+ stream.print tbl.read
92
+ rescue => e
93
+ stream.puts "# Could not dump table #{table.inspect} because of following #{e.class}"
94
+ stream.puts "# #{e.message}"
95
+ stream.puts
96
+ end
97
+
98
+ stream
99
+ end
100
+ end
101
+ end
102
+ end
@@ -4,15 +4,15 @@ module NumericTypeColumn
4
4
 
5
5
  module ActiveRecord
6
6
 
7
- module TableDefinitionExtension
7
+ module TableDefinitionPatch
8
8
 
9
9
  def self.included(base)
10
- #puts "NumericTypeColumn::ActiveRecord::TableDefinitionExtension included to #{base.name}!"
10
+ #puts "NumericTypeColumn::ActiveRecord::TableDefinitionPatch included to #{base.name}!"
11
11
  base.send :alias_method_chain, :column, :unsigned_and_comment
12
12
  end
13
13
 
14
14
  def column_with_unsigned_and_comment(name, type, options = {})
15
- #puts "NumericTypeColumn::ActiveRecord::TableDefinitionExtension: column_with_unsigned_and_comment(name: #{name}, type: #{type}, options = {})..."
15
+ #puts "NumericTypeColumn::ActiveRecord::TableDefinitionPatch: column_with_unsigned_and_comment(name: #{name}, type: #{type}, options = {})..."
16
16
  ret_column = column_without_unsigned_and_comment(name, type, options)
17
17
  ret_column[name].unsigned = options[:unsigned]
18
18
  ret_column[name].comment = options[:comment]
@@ -3,11 +3,14 @@
3
3
  module NumericTypeColumn
4
4
 
5
5
  module ActiveRecord
6
- autoload :AbstractMysqlAdapterExtension, 'numeric_type_column/active_record/abstract_mysql_adapter_extension'
7
- autoload :BaseExtension, 'numeric_type_column/active_record/base_extension'
8
- autoload :BelongsToPolimorphicAssociationExtension, 'numeric_type_column/active_record/belongs_to_polimorphic_association_extension'
9
- autoload :ColumnDefinitionExtension, 'numeric_type_column/active_record/column_definition_extension'
10
- autoload :TableDefinitionExtension, 'numeric_type_column/active_record/table_definition_extension'
6
+ autoload :MysqlAdapterPatch, 'numeric_type_column/active_record/mysql_adapter_patch'
7
+ autoload :ColumnDefinitionPatch, 'numeric_type_column/active_record/column_definition_patch'
8
+ autoload :TableDefinitionPatch, 'numeric_type_column/active_record/table_definition_patch'
9
+ autoload :SchemaDumperPatch, 'numeric_type_column/active_record/schema_dumper_patch'
10
+
11
+
12
+ autoload :BasePatch, 'numeric_type_column/active_record/base_patch'
13
+ autoload :BelongsToPolymorphicAssociationPatch, 'numeric_type_column/active_record/belongs_to_polymorphic_association_patch'
11
14
  end
12
15
 
13
16
  end
@@ -6,15 +6,21 @@ module NumericTypeColumn
6
6
  ActiveSupport.on_load(:active_record) do
7
7
 
8
8
  # Patches para permitir definir columnas UNSIGNED y COMMENTS en MySQL:
9
- ::ActiveRecord::ConnectionAdapters::ColumnDefinition.send :include, NumericTypeColumn::ActiveRecord::ColumnDefinitionExtension
10
- ::ActiveRecord::ConnectionAdapters::TableDefinition.send :include, NumericTypeColumn::ActiveRecord::TableDefinitionExtension
11
- ::ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.send :include, NumericTypeColumn::ActiveRecord::AbstractMysqlAdapterExtension
9
+ adaptr_module = "::ActiveRecord::ConnectionAdapters"
10
+ "#{adaptr_module}::ColumnDefinition".constantize.send :include, NumericTypeColumn::ActiveRecord::ColumnDefinitionPatch
11
+ "#{adaptr_module}::TableDefinition".constantize.send :include, NumericTypeColumn::ActiveRecord::TableDefinitionPatch
12
+ ["MysqlAdapter", "Mysql2Adapter"].each do |mysql_adapter_name|
13
+ if adaptr_module.constantize.const_defined? mysql_adapter_name
14
+ "#{adaptr_module}::#{mysql_adapter_name}".constantize.send :include, NumericTypeColumn::ActiveRecord::MysqlAdapterPatch
15
+ end
16
+ end
17
+ ::ActiveRecord::SchemaDumper.send :include, NumericTypeColumn::ActiveRecord::SchemaDumperPatch
12
18
 
13
19
  # Patch para permitir STI con columna numerica:
14
- ::ActiveRecord::Base.extend NumericTypeColumn::ActiveRecord::BaseExtension
20
+ ::ActiveRecord::Base.extend NumericTypeColumn::ActiveRecord::BasePatch
15
21
 
16
22
  # Patch para permitir polymorphs con columna foreign_type numerica:
17
- #::ActiveRecord::Associations::BelongsToPolymorphicAssociation.send :include, NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationExtension
23
+ #::ActiveRecord::Associations::BelongsToPolymorphicAssociation.extend NumericTypeColumn::ActiveRecord::BelongsToPolymorphicAssociationPatch
18
24
 
19
25
 
20
26
  end
@@ -1,3 +1,3 @@
1
1
  module NumericTypeColumn
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,261 @@
1
+ == Welcome to Rails
2
+
3
+ Rails is a web-application framework that includes everything needed to create
4
+ database-backed web applications according to the Model-View-Control pattern.
5
+
6
+ This pattern splits the view (also called the presentation) into "dumb"
7
+ templates that are primarily responsible for inserting pre-built data in between
8
+ HTML tags. The model contains the "smart" domain objects (such as Account,
9
+ Product, Person, Post) that holds all the business logic and knows how to
10
+ persist themselves to a database. The controller handles the incoming requests
11
+ (such as Save New Account, Update Product, Show Post) by manipulating the model
12
+ and directing data to the view.
13
+
14
+ In Rails, the model is handled by what's called an object-relational mapping
15
+ layer entitled Active Record. This layer allows you to present the data from
16
+ database rows as objects and embellish these data objects with business logic
17
+ methods. You can read more about Active Record in
18
+ link:files/vendor/rails/activerecord/README.html.
19
+
20
+ The controller and view are handled by the Action Pack, which handles both
21
+ layers by its two parts: Action View and Action Controller. These two layers
22
+ are bundled in a single package due to their heavy interdependence. This is
23
+ unlike the relationship between the Active Record and Action Pack that is much
24
+ more separate. Each of these packages can be used independently outside of
25
+ Rails. You can read more about Action Pack in
26
+ link:files/vendor/rails/actionpack/README.html.
27
+
28
+
29
+ == Getting Started
30
+
31
+ 1. At the command prompt, create a new Rails application:
32
+ <tt>rails new myapp</tt> (where <tt>myapp</tt> is the application name)
33
+
34
+ 2. Change directory to <tt>myapp</tt> and start the web server:
35
+ <tt>cd myapp; rails server</tt> (run with --help for options)
36
+
37
+ 3. Go to http://localhost:3000/ and you'll see:
38
+ "Welcome aboard: You're riding Ruby on Rails!"
39
+
40
+ 4. Follow the guidelines to start developing your application. You can find
41
+ the following resources handy:
42
+
43
+ * The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html
44
+ * Ruby on Rails Tutorial Book: http://www.railstutorial.org/
45
+
46
+
47
+ == Debugging Rails
48
+
49
+ Sometimes your application goes wrong. Fortunately there are a lot of tools that
50
+ will help you debug it and get it back on the rails.
51
+
52
+ First area to check is the application log files. Have "tail -f" commands
53
+ running on the server.log and development.log. Rails will automatically display
54
+ debugging and runtime information to these files. Debugging info will also be
55
+ shown in the browser on requests from 127.0.0.1.
56
+
57
+ You can also log your own messages directly into the log file from your code
58
+ using the Ruby logger class from inside your controllers. Example:
59
+
60
+ class WeblogController < ActionController::Base
61
+ def destroy
62
+ @weblog = Weblog.find(params[:id])
63
+ @weblog.destroy
64
+ logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!")
65
+ end
66
+ end
67
+
68
+ The result will be a message in your log file along the lines of:
69
+
70
+ Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1!
71
+
72
+ More information on how to use the logger is at http://www.ruby-doc.org/core/
73
+
74
+ Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are
75
+ several books available online as well:
76
+
77
+ * Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe)
78
+ * Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide)
79
+
80
+ These two books will bring you up to speed on the Ruby language and also on
81
+ programming in general.
82
+
83
+
84
+ == Debugger
85
+
86
+ Debugger support is available through the debugger command when you start your
87
+ Mongrel or WEBrick server with --debugger. This means that you can break out of
88
+ execution at any point in the code, investigate and change the model, and then,
89
+ resume execution! You need to install ruby-debug to run the server in debugging
90
+ mode. With gems, use <tt>sudo gem install ruby-debug</tt>. Example:
91
+
92
+ class WeblogController < ActionController::Base
93
+ def index
94
+ @posts = Post.all
95
+ debugger
96
+ end
97
+ end
98
+
99
+ So the controller will accept the action, run the first line, then present you
100
+ with a IRB prompt in the server window. Here you can do things like:
101
+
102
+ >> @posts.inspect
103
+ => "[#<Post:0x14a6be8
104
+ @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>,
105
+ #<Post:0x14a6620
106
+ @attributes={"title"=>"Rails", "body"=>"Only ten..", "id"=>"2"}>]"
107
+ >> @posts.first.title = "hello from a debugger"
108
+ => "hello from a debugger"
109
+
110
+ ...and even better, you can examine how your runtime objects actually work:
111
+
112
+ >> f = @posts.first
113
+ => #<Post:0x13630c4 @attributes={"title"=>nil, "body"=>nil, "id"=>"1"}>
114
+ >> f.
115
+ Display all 152 possibilities? (y or n)
116
+
117
+ Finally, when you're ready to resume execution, you can enter "cont".
118
+
119
+
120
+ == Console
121
+
122
+ The console is a Ruby shell, which allows you to interact with your
123
+ application's domain model. Here you'll have all parts of the application
124
+ configured, just like it is when the application is running. You can inspect
125
+ domain models, change values, and save to the database. Starting the script
126
+ without arguments will launch it in the development environment.
127
+
128
+ To start the console, run <tt>rails console</tt> from the application
129
+ directory.
130
+
131
+ Options:
132
+
133
+ * Passing the <tt>-s, --sandbox</tt> argument will rollback any modifications
134
+ made to the database.
135
+ * Passing an environment name as an argument will load the corresponding
136
+ environment. Example: <tt>rails console production</tt>.
137
+
138
+ To reload your controllers and models after launching the console run
139
+ <tt>reload!</tt>
140
+
141
+ More information about irb can be found at:
142
+ link:http://www.rubycentral.org/pickaxe/irb.html
143
+
144
+
145
+ == dbconsole
146
+
147
+ You can go to the command line of your database directly through <tt>rails
148
+ dbconsole</tt>. You would be connected to the database with the credentials
149
+ defined in database.yml. Starting the script without arguments will connect you
150
+ to the development database. Passing an argument will connect you to a different
151
+ database, like <tt>rails dbconsole production</tt>. Currently works for MySQL,
152
+ PostgreSQL and SQLite 3.
153
+
154
+ == Description of Contents
155
+
156
+ The default directory structure of a generated Ruby on Rails application:
157
+
158
+ |-- app
159
+ | |-- assets
160
+ | |-- images
161
+ | |-- javascripts
162
+ | `-- stylesheets
163
+ | |-- controllers
164
+ | |-- helpers
165
+ | |-- mailers
166
+ | |-- models
167
+ | `-- views
168
+ | `-- layouts
169
+ |-- config
170
+ | |-- environments
171
+ | |-- initializers
172
+ | `-- locales
173
+ |-- db
174
+ |-- doc
175
+ |-- lib
176
+ | `-- tasks
177
+ |-- log
178
+ |-- public
179
+ |-- script
180
+ |-- test
181
+ | |-- fixtures
182
+ | |-- functional
183
+ | |-- integration
184
+ | |-- performance
185
+ | `-- unit
186
+ |-- tmp
187
+ | |-- cache
188
+ | |-- pids
189
+ | |-- sessions
190
+ | `-- sockets
191
+ `-- vendor
192
+ |-- assets
193
+ `-- stylesheets
194
+ `-- plugins
195
+
196
+ app
197
+ Holds all the code that's specific to this particular application.
198
+
199
+ app/assets
200
+ Contains subdirectories for images, stylesheets, and JavaScript files.
201
+
202
+ app/controllers
203
+ Holds controllers that should be named like weblogs_controller.rb for
204
+ automated URL mapping. All controllers should descend from
205
+ ApplicationController which itself descends from ActionController::Base.
206
+
207
+ app/models
208
+ Holds models that should be named like post.rb. Models descend from
209
+ ActiveRecord::Base by default.
210
+
211
+ app/views
212
+ Holds the template files for the view that should be named like
213
+ weblogs/index.html.erb for the WeblogsController#index action. All views use
214
+ eRuby syntax by default.
215
+
216
+ app/views/layouts
217
+ Holds the template files for layouts to be used with views. This models the
218
+ common header/footer method of wrapping views. In your views, define a layout
219
+ using the <tt>layout :default</tt> and create a file named default.html.erb.
220
+ Inside default.html.erb, call <% yield %> to render the view using this
221
+ layout.
222
+
223
+ app/helpers
224
+ Holds view helpers that should be named like weblogs_helper.rb. These are
225
+ generated for you automatically when using generators for controllers.
226
+ Helpers can be used to wrap functionality for your views into methods.
227
+
228
+ config
229
+ Configuration files for the Rails environment, the routing map, the database,
230
+ and other dependencies.
231
+
232
+ db
233
+ Contains the database schema in schema.rb. db/migrate contains all the
234
+ sequence of Migrations for your schema.
235
+
236
+ doc
237
+ This directory is where your application documentation will be stored when
238
+ generated using <tt>rake doc:app</tt>
239
+
240
+ lib
241
+ Application specific libraries. Basically, any kind of custom code that
242
+ doesn't belong under controllers, models, or helpers. This directory is in
243
+ the load path.
244
+
245
+ public
246
+ The directory available for the web server. Also contains the dispatchers and the
247
+ default HTML files. This should be set as the DOCUMENT_ROOT of your web
248
+ server.
249
+
250
+ script
251
+ Helper scripts for automation and generation.
252
+
253
+ test
254
+ Unit and functional tests along with fixtures. When using the rails generate
255
+ command, template test files will be generated for you and placed in this
256
+ directory.
257
+
258
+ vendor
259
+ External libraries that the application depends on. Also includes the plugins
260
+ subdirectory. If the app has frozen rails, those gems also go here, under
261
+ vendor/rails/. This directory is in the load path.
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ Dummy::Application.load_tasks
@@ -0,0 +1,15 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
@@ -0,0 +1,2 @@
1
+ // Place all the behaviors and hooks related to the matching controller here.
2
+ // All this logic will automatically be available in application.js.