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
:limit
for string/text/binary/integer, :precision/:scale for decimals or:polymorphic
for 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.lease_connection.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