class Avo::Fields::HasOneField
def fill_field(model, key, value)
def fill_field(model, key, value) if value.blank? related_model = nil else related_class = model.class.reflections[name.to_s.downcase].class_name related_model = related_class.safe_constantize.find value end model.public_send("#{key}=", related_model) model end
def get_related_resource(resource)
def get_related_resource(resource) class_name = resource.model.reflections[name.to_s.downcase].class_name App.get_resources.find { |r| r.class == "Avo::Resources::#{class_name}".safe_constantize } end
def hydrate_field(fields, model, resource, view)
def hydrate_field(fields, model, resource, view) target_resource = get_related_resource(resource) fields[:relation_class] = target_resource.class.to_s relation_model = model.public_send(@relation_method) if relation_model.present? relation_model = model.public_send(@relation_method) fields[:value] = relation_model.send(target_resource.title) fields[:database_value] = relation_model[:id] fields[:link] = Avo::Resources::Resource.show_path(relation_model) end # Populate the options on show and edit fields[:options] = [] if [:edit, :create].include? view fields[:options] = target_resource.model.all.map do |model| { value: model.id, label: model.send(target_resource.title) } end end fields[:resource_name_plural] = target_resource.resource_name_plural fields end
def initialize(name, **args, &block)
def initialize(name, **args, &block) @defaults = { updatable: true, component: 'has-one-field', } super(name, **args, &block) hide_on :create @placeholder = 'Choose an option' @relation_method = name.to_s.parameterize.underscore end