Sha256: c66535fb24871887eb4602a7e87f7f0b0791c0cb6286072a503722c058daa814

Contents?: true

Size: 1.7 KB

Versions: 8

Compression:

Stored size: 1.7 KB

Contents

module Rasti
  module DB
    module Relations
      class ManyToOne < Base

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

        def fetch_graph(environment, rows, selected_attributes=nil, excluded_attributes=nil, relations_graph=nil)
          fks = rows.map { |row| row[foreign_key] }.uniq

          target_collection = target_collection_class.new environment

          query = target_collection.where(source_collection_class.primary_key => fks)
          query = query.exclude_attributes(*excluded_attributes) if excluded_attributes
          query = query.select_attributes(*selected_attributes) if selected_attributes
          query = relations_graph.apply_to query if relations_graph

          relation_rows = query.each_with_object({}) do |row, hash| 
            hash[row.public_send(source_collection_class.primary_key)] = row
          end
          
          rows.each do |row| 
            row[name] = relation_rows[row[foreign_key]]
          end
        end

        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][target_collection_class.primary_key] => relation_name[foreign_key]
          }

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

        def apply_filter(environment, dataset, primary_keys)
          dataset.where(foreign_key => primary_keys)
        end

      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
rasti-db-2.3.3 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.3.2 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.3.1 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.3.0 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.2.0 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.1.0 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.0.1 lib/rasti/db/relations/many_to_one.rb
rasti-db-2.0.0 lib/rasti/db/relations/many_to_one.rb