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 10%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 8%w(index uniq)
-
UNIQ_INDEX_OPTIONS =
# File 'railties/lib/rails/generators/generated_attribute.rb', line 9%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 109
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 67
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 35
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 89
def (type) case type when /(text|binary)\{([a-z]+)\}/ return $1, size: $2.to_sym when /(string|text|binary|integer)\{(\d+)\}/ return $1, limit: $2.to_i when /decimal\{(\d)[,.-](\d)\}/ return :decimal, precision: $1.to_i, scale: $2.to_i when /(references|belongs_to)\{(.+)\}/ type = $1 = $2.split(/[,.-]/) = Hash[ .map { |opt| [opt.to_sym, true] }] return type, else return type, {} end end
.reference?(type) ⇒ Boolean
.valid_index_type?(index_type) ⇒ Boolean
# File 'railties/lib/rails/generators/generated_attribute.rb', line 78
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 72
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 211
def type == : end
#attachments? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 215
def type == : end
#attr_options (readonly)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 31
attr_reader :
#foreign_key? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 175
def foreign_key? name.end_with?("_id") end
#has_index? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 191
def has_index? @has_index end
#has_uniq_index? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 195
def has_uniq_index? @has_uniq_index end
#index_name (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 163
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 32
attr_writer :index_name
#name (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 30
attr_accessor :name, :type
#password_digest? ⇒ Boolean
(readonly)
[ GitHub ]
#polymorphic? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 183
def polymorphic? [:polymorphic] end
#reference? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 179
def reference? self.class.reference?(type) end
#required? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 187
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 207
def rich_text? type == :rich_text end
#token? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 203
def token? type == :token end
#type (rw)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 30
attr_accessor :name, :type
#virtual? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'railties/lib/rails/generators/generated_attribute.rb', line 219
def virtual? rich_text? || || end
Instance Method Details
#column_name
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 171
def column_name @column_name ||= reference? ? "#{name}_id" : name end
#default
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 133
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 117
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 :text_area when :rich_text then :rich_text_area when :boolean then :check_box when :, : then :file_field else :text_field end end
#human_name
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 159
def human_name name.humanize end
#inject_index_options
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 227
def has_uniq_index? ? ", unique: true" : "" end
#inject_options
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 223
def (+"").tap { |s| .each { |k, v| s << ", #{k}: #{v.inspect}" } } end
#options_for_migration
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 231
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 151
def plural_name name.delete_suffix("_id").pluralize end
#print_attribute_options (private)
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 254
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 155
def singular_name name.delete_suffix("_id").singularize end
#to_s
[ GitHub ]# File 'railties/lib/rails/generators/generated_attribute.rb', line 243
def to_s if has_uniq_index? "#{name}:#{type}#{}:uniq" elsif has_index? "#{name}:#{type}#{}:index" else "#{name}:#{type}#{}" end end