Class: Fiona7::LinkedIdFinder

Inherits:
Object
  • Object
show all
Defined in:
lib/fiona7/linked_id_finder.rb

Instance Method Summary collapse

Constructor Details

#initialize(fields = [], connection = ::Fiona7::WriteObj.connection, instance_name = RailsConnector::CmsBaseModel.instance_name) ⇒ LinkedIdFinder

Returns a new instance of LinkedIdFinder.



6
7
8
9
10
11
12
# File 'lib/fiona7/linked_id_finder.rb', line 6

def initialize(fields=[], connection=::Fiona7::WriteObj.connection, instance_name=RailsConnector::CmsBaseModel.instance_name)
  @fields     = fields.map {|f|
    Fiona7::AttributeNamesFromCms.new(f).attributes
  }.flatten
  @instance   = instance_name
  @connection = connection
end

Instance Method Details

#find(klass, ids) ⇒ Object



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
# File 'lib/fiona7/linked_id_finder.rb', line 14

def find(klass, ids)
  mode               = klass == Fiona7::ReleasedObj ? :live : :preview
  forbidden          = Fiona7::ForbiddenObjClasses.new

  # first we find objects linking directly
  # NOTE: this may return widget objects
  linking_directly   = Fiona7::SuperIdFinder.new(
    forbidden.system_obj_classes, @fields, @connection, @instance
  ).find(
    mode, ids
  )

  # now we resolve widget objects
  linking_indirectly = Fiona7::SuperIdFinder.new(
    forbidden.all, ['X_widget_pool'], @connection, @instance
  ).find(
    mode, linking_directly
  )

  all_linking        = linking_directly + linking_indirectly

  # finally, this removes widget objects from the result
  # we also remove system classes, just to be extra sure
  klass.
    where(obj_id: all_linking).
    where.not(obj_class: forbidden.all).
    select(:obj_id).
    map(&:obj_id)
end