lib/avo/fields/belongs_to_field.rb in avo-1.6.2.pre.1 vs lib/avo/fields/belongs_to_field.rb in avo-1.6.3.pre.1

- old
+ new

@@ -1,20 +1,30 @@ module Avo module Fields class BelongsToField < BaseField attr_reader :searchable + attr_reader :polymorphic_as + attr_reader :polymorphic_for attr_reader :relation_method def initialize(id, **args, &block) args[:placeholder] ||= I18n.t("avo.choose_an_option") super(id, **args, &block) @searchable = args[:searchable] == true + @polymorphic_as = args[:polymorphic_as] + @polymorphic_for = args[:polymorphic_for] @relation_method = name.to_s.parameterize.underscore + + hide_on(:edit, :new) if polymorphic_as.present? end + def value + super(polymorphic_as) + end + def options target_resource.model_class.all.map do |model| { value: model.id, label: model.send(target_resource.class.title) @@ -26,20 +36,22 @@ target_resource.id end def foreign_key if @model.present? - if @model.instance_of?(Class) - @model.reflections[@relation_method].foreign_key - else - @model.class.reflections[@relation_method].foreign_key - end - elsif @resource.present? + get_model_class(@model).reflections[@relation_method].foreign_key + elsif @resource.present? && @resource.model_class.reflections[@relation_method].present? @resource.model_class.reflections[@relation_method].foreign_key end end + def reflection_for_key(key) + get_model_class(get_model).reflections[key.to_s] + rescue + nil + end + def relation_model_class @resource.model_class end def label @@ -49,15 +61,43 @@ def to_permitted_param foreign_key.to_sym end def target_resource - if @model._reflections[id.to_s].klass.present? - App.get_resource_by_model_name @model._reflections[id.to_s].klass.to_s - elsif @model._reflections[id.to_s].options[:class_name].present? - App.get_resource_by_model_name @model._reflections[id.to_s].options[:class_name] + return App.get_resource_by_model_name(polymorphic_for) if polymorphic_for.present? + + reflection_key = polymorphic_as || id + + if @model._reflections[reflection_key.to_s].klass.present? + App.get_resource_by_model_name @model._reflections[reflection_key.to_s].klass.to_s + elsif @model._reflections[reflection_key.to_s].options[:class_name].present? + App.get_resource_by_model_name @model._reflections[reflection_key.to_s].options[:class_name] else - App.get_resource_by_name id.to_s + App.get_resource_by_name reflection_key.to_s + end + end + + def get_model + return @model if @model.present? + + @resource.model + rescue + nil + end + + def name + return polymorphic_as.to_s.humanize if polymorphic_as.present? && view == :index + + super + end + + private + + def get_model_class(model) + if model.instance_of?(Class) + model + else + model.class end end end end end