module ROM::SQL::AttributeAliasing

@api private

Public Instance Methods

aliased(alias_name) click to toggle source

Return a new attribute with an alias

@example

users[:id].aliased(:user_id)

@return [SQL::Attribute]

@api public

Calls superclass method
# File lib/rom/sql/attribute_aliasing.rb, line 15
def aliased(alias_name)
  new_name, new_alias_name = extract_alias_names(alias_name)

  super(new_alias_name).with(name: new_name).meta(
    sql_expr: alias_sql_expr(sql_expr, new_alias_name)
  )
end
Also aliased as: as
aliased_projection?() click to toggle source

Return true if this attribute is an aliased projection

@example

class Tasks < ROM::Relation[:memory]
  schema do
    attribute :user_id, Types::Integer, alias: :id
    attribute :name, Types::String
  end
end

Users.schema[:user_id].aliased?
# => true
Users.schema[:user_id].aliased_projection?
# => false

Users.schema[:user_id].qualified_projection.aliased?
# => true
Users.schema[:user_id].qualified_projection.aliased_projection?
# => true

@return [TrueClass,FalseClass]

@api private

# File lib/rom/sql/attribute_aliasing.rb, line 48
def aliased_projection?
  self.meta[:sql_expr].is_a?(Sequel::SQL::AliasedExpression)
end
as(alias_name)
Alias for: aliased

Private Instance Methods

alias_sql_expr(sql_expr, new_alias) click to toggle source

@api private

# File lib/rom/sql/attribute_aliasing.rb, line 55
def alias_sql_expr(sql_expr, new_alias)
  case sql_expr
  when Sequel::SQL::AliasedExpression
    Sequel::SQL::AliasedExpression.new(sql_expr.expression, new_alias, sql_expr.columns)
  else
    sql_expr.as(new_alias)
  end
end
extract_alias_names(alias_name) click to toggle source

@api private

# File lib/rom/sql/attribute_aliasing.rb, line 65
def extract_alias_names(alias_name)
  new_name, new_alias_name = nil

  if wrapped? && aliased?
    # If the attribute is wrapped *and* aliased, make sure that we name the
    # attribute in a way that will map the the requested alias name.
    # Without this, the attribute will silently ignore the requested alias
    # name and default to the pre-existing name.
    new_name = "#{meta[:wrapped]}_#{options[:alias]}".to_sym

    # Essentially, this makes it so "wrapped" attributes aren't true
    # aliases, in that we actually alias the wrapped attribute, we use
    # the old alias.
    new_alias_name = options[:alias]
  else
    new_name = name || alias_name
    new_alias_name = alias_name
  end

  [new_name, new_alias_name]
end