Module: Findable::Associations::ClassMethods

Defined in:
lib/findable/associations.rb

Instance Method Summary collapse

Instance Method Details

#belongs_to(*args) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/findable/associations.rb', line 28

def belongs_to(*args)
  name, options = Utils.parse_args(args)
  model = Utils.model_for(name, safe: true, **options)
  foreign_key = options[:foreign_key].presence || name.to_s.foreign_key

  if options[:polymorphic]
    define_method(name) do
      public_send("#{name}_type").constantize.find(public_send(foreign_key))
    end
  else
    define_field(foreign_key)

    define_method(name) do
      model.find_by(model.primary_key => public_send(foreign_key))
    end

    define_method("#{name}=") do |value|
      attributes[foreign_key.to_sym] = value ? value.public_send(model.primary_key) : nil
    end
  end
end

#has_many(*args) ⇒ Object



8
9
10
11
12
13
14
15
16
# File 'lib/findable/associations.rb', line 8

def has_many(*args)
  name, options = Utils.parse_args(args)
  model = Utils.model_for(name, collection: true, **options)
  foreign_key = options[:foreign_key].presence || model_name.name.foreign_key

  define_method(name) do
    model.where(foreign_key => public_send(self.class.primary_key))
  end
end

#has_one(*args) ⇒ Object



18
19
20
21
22
23
24
25
26
# File 'lib/findable/associations.rb', line 18

def has_one(*args)
  name, options = Utils.parse_args(args)
  model = Utils.model_for(name, **options)
  foreign_key = options[:foreign_key].presence || model_name.name.foreign_key

  define_method(name) do
    model.find_by(foreign_key => public_send(self.class.primary_key))
  end
end