Module: BazaModels::Model::HasManyRelations::ClassMethods

Defined in:
lib/baza_models/model/has_many_relations.rb

Instance Method Summary collapse

Instance Method Details

#has_many(relation_name, *all_args) ⇒ Object

rubocop:disable Naming/PredicateName



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
# File 'lib/baza_models/model/has_many_relations.rb', line 8

def has_many(relation_name, *all_args)
  # rubocop:enable Naming/PredicateName

  args = all_args.pop

  relation = {
    type: :has_many,
    relation_name: relation_name,
    table_name: args[:table_name] || relation_name,
    args: args,
    all_args: all_args
  }

  if args[:foreign_key]
    relation[:foreign_key] = args.fetch(:foreign_key)
  else
    relation[:foreign_key] = :"#{StringCases.camel_to_snake(name)}_id"
  end

  relation[:dependent] = args.fetch(:dependent) if args[:dependent]

  if args && args[:class_name]
    relation[:class_name] = args.fetch(:class_name)
  else
    relation[:class_name] = StringCases.snake_to_camel(StringCases.singularize(relation_name))
  end

  @has_many_relations ||= []
  @has_many_relations << relation

  @relationships ||= {}
  @relationships[relation_name] = relation

  define_method(relation_name) do
    class_instance = StringCases.constantize(relation.fetch(:class_name))
    query = class_instance.where(relation.fetch(:foreign_key) => id)
    query.previous_model = self
    query.relation = relation

    all_args.each do |arg|
      query = query.instance_exec(&arg) if arg.is_a?(Proc)
    end

    query
  end
end