Class: Rasti::DB::Relations::OneToMany

Inherits:
Base
  • Object
show all
Defined in:
lib/rasti/db/relations/one_to_many.rb

Direct Known Subclasses

OneToOne

Instance Attribute Summary

Attributes inherited from Base

#name, #source_collection_class

Instance Method Summary collapse

Methods inherited from Base

#from_many?, #from_one?, #initialize, #join_relation_name, #many_to_many?, #many_to_one?, #one_to_many?, #one_to_one?, #target_collection_class, #to_many?, #to_one?

Constructor Details

This class inherits a constructor from Rasti::DB::Relations::Base

Instance Method Details

#add_join(environment, dataset, prefix = nil) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/rasti/db/relations/one_to_many.rb', line 30

def add_join(environment, dataset, prefix=nil)
  validate_join!

  relation_alias = join_relation_name prefix

  relation_name = prefix ? Sequel[prefix] : Sequel[source_collection_class.collection_name]

  relation_condition = {
    Sequel[relation_alias][foreign_key] => relation_name[source_collection_class.primary_key]
  }

  dataset.join(environment.qualify_collection(target_collection_class).as(relation_alias), relation_condition)
end

#apply_filter(environment, dataset, primary_keys) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/rasti/db/relations/one_to_many.rb', line 44

def apply_filter(environment, dataset, primary_keys)
  if source_collection_class.data_source_name == target_collection_class.data_source_name
    dataset.join(environment.qualify_collection(target_collection_class), foreign_key => source_collection_class.primary_key)
           .where(Sequel[target_collection_class.collection_name][target_collection_class.primary_key] => primary_keys)
           .select_all(target_collection_class.collection_name)
           .distinct
  else
    target_collection = target_collection_class.new environment
    fks = target_collection.where(target_collection_class.primary_key => primary_keys)
                           .pluck(foreign_key)
                           .uniq
    dataset.where(source_collection_class.primary_key => fks)
  end
end

#fetch_graph(environment, rows, selected_attributes = nil, excluded_attributes = nil, queries = nil, relations_graph = nil) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rasti/db/relations/one_to_many.rb', line 10

def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, queries=nil, relations_graph=nil)
  pks = rows.map { |row| row[source_collection_class.primary_key] }.uniq

  target_collection = target_collection_class.new environment

  query = target_collection.where(foreign_key => pks)
  query = query.exclude_attributes(*excluded_attributes) unless excluded_attributes.nil?
  query = query.select_attributes(*selected_attributes) unless selected_attributes.nil?

  query = queries.inject(query) { |new_query, sub_query| new_query.send(sub_query) } unless queries.nil?

  query = relations_graph.apply_to query if relations_graph

  relation_rows = query.group_by(&foreign_key)

  rows.each do |row|
    row[name] = build_graph_result relation_rows.fetch(row[source_collection_class.primary_key], [])
  end
end

#foreign_keyObject



6
7
8
# File 'lib/rasti/db/relations/one_to_many.rb', line 6

def foreign_key
  @foreign_key ||= options[:foreign_key] || source_collection_class.foreign_key
end