Module: CouchbaseOrm::EmbedsOne

Included in:
Base
Defined in:
lib/couchbase-orm/utilities/embeds_one.rb

Instance Method Summary collapse

Instance Method Details

#embeds_one(name, class_name: nil, store_as: nil, validate: true, polymorphic: false, default: nil) ⇒ Object



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
# File 'lib/couchbase-orm/utilities/embeds_one.rb', line 5

def embeds_one(name, class_name: nil, store_as: nil, validate: true, polymorphic: false, default: nil)
  storage_key = (store_as || name).to_sym
  attribute storage_key, :hash, default: nil

  instance_var = "@__assoc_#{name}"
  klass_name = (class_name || name.to_s.camelize)

  # Handle polymorphic parameter: can be true, false, or array of allowed types
  is_polymorphic = polymorphic.is_a?(Array) || polymorphic == true
  allowed_types = polymorphic.is_a?(Array) ? polymorphic.map { |t| t.to_s.camelize } : nil

  set_embedded(name, {
    type: :one,
    class_name: klass_name,
    key: storage_key,
    name: name,
    instance_var: instance_var,
    polymorphic: is_polymorphic,
    allowed_types: allowed_types,
    default: default,
  })

  if validate
    validates_embedded(name)
    validates_with CouchbaseOrm::PolymorphicTypeValidator, attributes: [name], allowed_types: allowed_types if allowed_types.present?
  end

  if is_polymorphic
    define_polymorphic_embeds_one_reader(name, storage_key, instance_var, default)
    define_polymorphic_embeds_one_writer(name, storage_key, instance_var, default)
  else
    define_standard_embeds_one_reader(name, storage_key, instance_var, klass_name, default)
    define_standard_embeds_one_writer(name, storage_key, instance_var, klass_name, default)
  end

  define_method(:"#{name}_reset") do
    remove_instance_variable(instance_var) if instance_variable_defined?(instance_var)
  end
end