# File lib/active_record/hierarchical_query/join_builder.rb, line 72 def primary_key @relation.table[@relation.klass.primary_key] end
class ActiveRecord::HierarchicalQuery::JoinBuilder
Public Class Methods
new(query, join_to, subquery_alias, options = {})
click to toggle source
@param [ActiveRecord::HierarchicalQuery::Query] query @param [ActiveRecord::Relation] join_to @param [#to_s] subquery_alias @param [Hash] options (:outer_join_hierarchical, :union_type)
# File lib/active_record/hierarchical_query/join_builder.rb, line 10 def initialize(query, join_to, subquery_alias, options = {}) @query = query @builder = CTE::QueryBuilder.new(query, options: options) @relation = join_to @alias = Arel::Table.new(subquery_alias) @options = options end
Public Instance Methods
build()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 18 def build if ActiveRecord.gem_version >= Gem::Version.new('5.2.0') relation = @relation # add ordering by "__order_column" relation.order_values += order_columns if ordered? relation = relation.joins(joined_arel_node) relation else relation = @relation # add ordering by "__order_column" relation.order_values += order_columns if ordered? relation = relation.joins(joined_arel_node) # copy bound variables from inner subquery relation.bind_values += bind_values relation end end
Private Instance Methods
aliased_subquery()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 56 def aliased_subquery SubqueryAlias.new(subquery, @alias) end
bind_values()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 84 def bind_values @builder.bind_values end
constraint()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 68 def constraint Arel::Nodes::On.new(primary_key.eq(foreign_key)) end
cte_arel()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 64 def cte_arel @cte_arel ||= @builder.build_arel end
custom_foreign_key()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 76 def custom_foreign_key @options[:foreign_key] end
foreign_key()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 80 def foreign_key custom_foreign_key ? @alias[custom_foreign_key] : @alias[@query.klass.primary_key] end
inner_join()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 48 def inner_join Arel::Nodes::InnerJoin.new(aliased_subquery, constraint) end
joined_arel_node()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 44 def joined_arel_node @options[:outer_join_hierarchical] == true ? outer_join : inner_join end
order_columns()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 92 def order_columns [@query.recursive_table[@query.ordering_column_name].asc] end
ordered?()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 88 def ordered? @query.orderings.any? end
outer_join()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 52 def outer_join Arel::Nodes::OuterJoin.new(aliased_subquery, constraint) end
primary_key()
click to toggle source
subquery()
click to toggle source
# File lib/active_record/hierarchical_query/join_builder.rb, line 60 def subquery Arel::Nodes::Grouping.new(cte_arel.ast) end