1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
module RailsAdmin
module Adapters
module Mongoid
class Property
STRING_TYPE_COLUMN_NAMES = [:name, :title, :subject]
attr_reader :property, :model
def initialize(property, model)
@property = property
@model = model
end
def name
property.name.to_sym
end
def pretty_name
property.name.to_s.tr('_', ' ').capitalize
end
def type
case property.type.to_s
when 'Array', 'Hash', 'Money'
:serialized
when 'BigDecimal'
:decimal
when 'Boolean', 'Mongoid::Boolean'
:boolean
when 'BSON::ObjectId', 'Moped::BSON::ObjectId'
:bson_object_id
when 'Date'
:date
when 'ActiveSupport::TimeWithZone', 'DateTime', 'Time'
:datetime
when 'Float'
:float
when 'Integer'
:integer
when 'Object'
object_field_type
when 'String'
string_field_type
when 'Symbol'
:string
else
:string
end
end
def length
(length_validation_lookup || 255) if type == :string
end
def nullable?
true
end
def serial?
name == :_id
end
def association?
false
end
def read_only?
false
end
private
def object_field_type
if [:belongs_to, :referenced_in, :embedded_in].
include?(model.relations.values.detect { |r| r.foreign_key.try(:to_sym) == name }.try(:macro).try(:to_sym))
:bson_object_id
else
:string
end
end
def string_field_type
if ((length = length_validation_lookup) && length < 256) || STRING_TYPE_COLUMN_NAMES.include?(name)
:string
else
:text
end
end
def length_validation_lookup
shortest = model.validators.select { |validator| validator.respond_to?(:attributes) && validator.attributes.include?(name.to_sym) && validator.kind == :length && validator.options[:maximum] }.min do |a, b|
a.options[:maximum] <=> b.options[:maximum]
end
shortest && shortest.options[:maximum]
end
end
end
end
end
|