Class: Rails::Generators::GeneratedAttribute
    Do not use.  This class is for internal use only.
  
| Relationships & Source Files | |
| Inherits: | Object | 
| Defined in: | railties/lib/rails/generators/generated_attribute.rb | 
Constant Summary
- 
    DEFAULT_TYPES =
    
# File 'railties/lib/rails/generators/generated_attribute.rb', line 11%w( attachment attachments belongs_to boolean date datetime decimal digest float integer references rich_text string text time timestamp token ) - 
    INDEX_OPTIONS =
    
# File 'railties/lib/rails/generators/generated_attribute.rb', line 9%w(index uniq) - 
    UNIQ_INDEX_OPTIONS =
    
# File 'railties/lib/rails/generators/generated_attribute.rb', line 10%w(uniq) 
Class Method Summary
- .dangerous_name?(name) ⇒ Boolean
 - .new(name, type = nil, index_type = false, attr_options = {}) ⇒ GeneratedAttribute constructor
 - .parse(column_definition)
 - .reference?(type) ⇒ Boolean
 - .valid_index_type?(index_type) ⇒ Boolean
 - .valid_type?(type) ⇒ Boolean
 - 
    
      .parse_type_and_options(type)  
    
    private
    
parse possible attribute options like
:limitfor string/text/binary/integer, :precision/:scale for decimals or:polymorphicfor references/belongs_to when declaring options curly brackets should be used. 
Instance Attribute Summary
- #attachment? ⇒ Boolean readonly
 - #attachments? ⇒ Boolean readonly
 - #attr_options readonly
 - #foreign_key? ⇒ Boolean readonly
 - #has_index? ⇒ Boolean readonly
 - #has_uniq_index? ⇒ Boolean readonly
 - #index_name rw
 - #index_name=(value) rw
 - #name rw
 - #password_digest? ⇒ Boolean readonly
 - #polymorphic? ⇒ Boolean readonly
 - #reference? ⇒ Boolean readonly
 - #required? ⇒ Boolean readonly
 - #rich_text? ⇒ Boolean readonly
 - #token? ⇒ Boolean readonly
 - #type rw
 - #virtual? ⇒ Boolean readonly
 
Instance Method Summary
Constructor Details
    .new(name, type = nil, index_type = false, attr_options = {})  ⇒ GeneratedAttribute 
  
# File 'railties/lib/rails/generators/generated_attribute.rb', line 114
def initialize(name, type = nil, index_type = false, = {}) @name = name @type = type || :string @has_index = INDEX_OPTIONS.include?(index_type) @has_uniq_index = UNIQ_INDEX_OPTIONS.include?(index_type) @attr_options = end
Class Method Details
    .dangerous_name?(name)  ⇒ Boolean 
  
# File 'railties/lib/rails/generators/generated_attribute.rb', line 68
def dangerous_name?(name) defined?(ActiveRecord::Base) && ActiveRecord::Base.dangerous_attribute_method?(name) end
.parse(column_definition)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 36
def parse(column_definition) name, type, index_type = column_definition.split(":") # if user provided "name:index" instead of "name:string:index" # type should be set blank so GeneratedAttribute's constructor # could set it to :string index_type, type = type, nil if valid_index_type?(type) type, = *(type) type = type.to_sym if type if dangerous_name?(name) raise Error, "Could not generate field '#{name}', as it is already defined by Active Record." end if type && !valid_type?(type) raise Error, "Could not generate field '#{name}' with unknown type '#{type}'." end if index_type && !valid_index_type?(index_type) raise Error, "Could not generate field '#{name}' with unknown index '#{index_type}'." end if type && reference?(type) if UNIQ_INDEX_OPTIONS.include?(index_type) [:index] = { unique: true } end end new(name, type, index_type, ) end
.parse_type_and_options(type) (private)
parse possible attribute options like :limit for string/text/binary/integer, :precision/:scale for decimals or :polymorphic for references/belongs_to when declaring options curly brackets should be used
# File 'railties/lib/rails/generators/generated_attribute.rb', line 90
def (type) case type when /(text|binary)\{([a-z]+)\}/ parsed_type, = $1, { size: $2.to_sym } when /(string|text|binary|integer)\{(\d+)\}/ parsed_type, = $1, { limit: $2.to_i } when /decimal\{(\d)[,.-](\d)\}/ parsed_type, = :decimal, { precision: $1.to_i, scale: $2.to_i } when /(references|belongs_to)\{(.+)\}/ parsed_type = $1 = $2.split(/[,.-]/) = Hash[.map { |opt| [opt.to_sym, true] }] else parsed_type, = type&.remove("!"), {} end if type&.ends_with?("!") [:null] = false end return parsed_type, end
    .reference?(type)  ⇒ Boolean 
  
    .valid_index_type?(index_type)  ⇒ Boolean 
  
# File 'railties/lib/rails/generators/generated_attribute.rb', line 79
def valid_index_type?(index_type) INDEX_OPTIONS.include?(index_type.to_s) end
    .valid_type?(type)  ⇒ Boolean 
  
# File 'railties/lib/rails/generators/generated_attribute.rb', line 73
def valid_type?(type) DEFAULT_TYPES.include?(type.to_s) || !defined?(ActiveRecord::Base) || ActiveRecord::Base.connection_db_config.adapter_class.valid_type?(type) end
Instance Attribute Details
    #attachment?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 216
def type == : end
    #attachments?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 220
def type == : end
#attr_options (readonly)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 32
attr_reader :
    #foreign_key?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 180
def foreign_key? name.end_with?("_id") end
    #has_index?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 196
def has_index? @has_index end
    #has_uniq_index?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 200
def has_uniq_index? @has_uniq_index end
#index_name (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 168
def index_name @index_name ||= if polymorphic? %w(id type).map { |t| "#{name}_#{t}" } else column_name end end
#index_name=(value) (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 33
attr_writer :index_name
#name (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 31
attr_accessor :name, :type
    #password_digest?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
    #polymorphic?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 188
def polymorphic? [:polymorphic] end
    #reference?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 184
def reference? self.class.reference?(type) end
    #required?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 192
def required? reference? && Rails.application.config.active_record.belongs_to_required_by_default end
    #rich_text?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 212
def rich_text? type == :rich_text end
    #token?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 208
def token? type == :token end
#type (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 31
attr_accessor :name, :type
    #virtual?  ⇒ Boolean  (readonly)
  
  [ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 224
def virtual? rich_text? || || end
Instance Method Details
#column_name
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 176
def column_name @column_name ||= reference? ? "#{name}_id" : name end
#default
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 138
def default @default ||= case type when :integer then 1 when :float then 1.5 when :decimal then "9.99" when :datetime, :, :time then Time.now.to_fs(:db) when :date then Date.today.to_fs(:db) when :string then name == "type" ? "" : "MyString" when :text then "MyText" when :boolean then false when :references, :belongs_to, :, :, :rich_text then nil else "" end end
#field_type
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 122
def field_type @field_type ||= case type when :integer then :number_field when :float, :decimal then :text_field when :time then :time_field when :datetime, : then :datetime_field when :date then :date_field when :text then :textarea when :rich_text then :rich_textarea when :boolean then :checkbox when :, : then :file_field else :text_field end end
#human_name
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 164
def human_name name.humanize end
#inject_index_options
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 232
def has_uniq_index? ? ", unique: true" : "" end
#inject_options
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 228
def (+"").tap { |s| .each { |k, v| s << ", #{k}: #{v.inspect}" } } end
#options_for_migration
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 236
def @attr_options.dup.tap do || if required? [:null] = false end if reference? && !polymorphic? [:foreign_key] = true end end end
#plural_name
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 156
def plural_name name.delete_suffix("_id").pluralize end
#print_attribute_options (private)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 259
def if .empty? "" elsif [:size] "{#{[:size]}}" elsif [:limit] "{#{[:limit]}}" elsif [:precision] && [:scale] "{#{[:precision]},#{[:scale]}}" else "{#{.keys.join(",")}}" end end
#singular_name
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 160
def singular_name name.delete_suffix("_id").singularize end
#to_s
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 248
def to_s if has_uniq_index? "#{name}:#{type}#{}:uniq" elsif has_index? "#{name}:#{type}#{}:index" else "#{name}:#{type}#{}" end end