class Clear::Reflection::Column

Overview

Reflection of the columns using information_schema in postgreSQL.

TODO Usage of view instead of model

Included Modules

Extended Modules

Defined in:

clear/model/reflection/column.cr

Constant Summary

COLUMNS = {"table_catalog" => {type: String, primary: false, converter: "String", db_column_name: "table_catalog", crystal_variable_name: table_catalog, presence: true}, "table_schema" => {type: String, primary: false, converter: "String", db_column_name: "table_schema", crystal_variable_name: table_schema, presence: true}, "table_name" => {type: ::Union(String, ::Nil), primary: false, converter: "String", db_column_name: "table_name", crystal_variable_name: table_name, presence: true}, "column_name" => {type: String, primary: true, converter: "String", db_column_name: "column_name", crystal_variable_name: column_name, presence: true}} of Nil => Nil
POLYMORPHISM_SETTINGS = {} of Nil => Nil

Constructors

Class Method Summary

Instance Method Summary

Instance methods inherited from module Clear::Model

cache : Clear::Model::QueryCache | Nil cache, pkey pkey

Class methods inherited from module Clear::Model::FullTextSearchable

to_tsq(text) to_tsq

Instance methods inherited from module Clear::Model::HasValidation

add_error(column, reason)
add_error(reason)
add_error
, clear_errors clear_errors, error? error?, errors : Array(Error) errors, print_errors print_errors, valid! valid!, valid? valid?, validate validate

Instance methods inherited from module Clear::Model::HasSaving

delete delete, persisted? : Bool persisted?, reload : self reload, save(on_conflict : Clear::SQL::InsertQuery -> | Nil = nil)
save(&block)
save
, save!(on_conflict : Clear::SQL::InsertQuery -> | Nil = nil)
save!(&block : Clear::SQL::InsertQuery -> )
save!
, update(**args) update, update!(**args) update!

Instance methods inherited from module Clear::Model::HasColumns

[](x) : Clear::SQL::Any [], []?(x) : Clear::SQL::Any []?, reset(h : Hash(String, _))
reset(h : Hash(Symbol, _))
reset(**t : **T) forall T
reset
, set(h : Hash(String, _))
set(h : Hash(Symbol, _))
set(**t : **T) forall T
set
, to_h(full = false) to_h, update_h update_h

Instance methods inherited from module Clear::Model::HasHooks

trigger_after_events(event_name) trigger_after_events, trigger_before_events(event_name) trigger_before_events, with_triggers(event_name, &) with_triggers

Instance methods inherited from module Clear::ErrorMessages

build_error_message(message : String, ways_to_resolve : Tuple | Array = Tuple.new, manual_pages : Tuple | Array = Tuple.new) build_error_message, converter_error(from, to) converter_error, format_width(x, w = 80) format_width, illegal_setter_access_to_undefined_column(name) illegal_setter_access_to_undefined_column, lack_of_primary_key(model_name) lack_of_primary_key, migration_already_down(number) migration_already_down, migration_already_up(number) migration_already_up, migration_drop_irreversible(name) migration_drop_irreversible, migration_irreversible(name = nil, operation = nil) migration_irreversible, migration_not_found(number) migration_not_found, migration_not_unique(numbers) migration_not_unique, no_migration_yet(version) no_migration_yet, null_column_mapping_error(name, type) null_column_mapping_error, order_by_error_invalid_order(current_order) order_by_error_invalid_order, polymorphic_nil(through) polymorphic_nil, polymorphic_unknown_class(class_name) polymorphic_unknown_class, query_building_error(message) query_building_error, uid_not_found(class_name) uid_not_found, uninitialized_db_connection(connection) uninitialized_db_connection

Constructor Detail

def self.create(x : Hash) : self #

[View source]
def self.create(x : NamedTuple) : self #

[View source]
def self.create(**args) : self #

Build and new model and save it. Returns the model.

The model may not be saved due to validation failure; check the returned model errors? and persisted? flags.


[View source]
def self.create!(a : Hash) : self #

[View source]
def self.create!(x : NamedTuple) : self #

[View source]
def self.create!(**args) : self #

Build and new model and save it. Returns the model.

Returns the newly inserted model Raises an exception if validation failed during the saving process.


[View source]
def self.new(h : Hash(String, _), cache : Clear::Model::QueryCache | Nil = nil, persisted = false, fetch_columns = false) #

[View source]
def self.new(json : JSON::Any, cache : Clear::Model::QueryCache | Nil = nil, persisted = false) #

[View source]
def self.new(t : NamedTuple, persisted = false) #

[View source]
def self.new #

[View source]

Class Method Detail

def self.build(**x : **T) forall T #

Build a new empty model and fill the columns using the NamedTuple in argument.

Returns the new model


[View source]
def self.columns #

[View source]
def self.connection : String #

Define on which connection the model is living. Useful in case of models living in different databases.

Is set to "default" by default.

See Clear::SQL#init(URI, *opts) for more information about multi-connections.

Example:

 Clear::SQL.init("postgres://postgres@localhost/database_1")
 Clear::SQL.init("secondary", "postgres://postgres@localhost/database_2")

class ModelA
  include Clear::Model

  # Performs all the queries on `database_1`
  # self.connection = "default"
  column id : Int32, primary: true, presence: false
  column title : String
end

class ModelB
  include Clear::Model

  # Performs all the queries on `database_2`
  self.connection = "secondary"

  column id : Int32, primary: true, presence: false
end

def self.connection=(connection : String) #

Define on which connection the model is living. Useful in case of models living in different databases.

Is set to "default" by default.

See Clear::SQL#init(URI, *opts) for more information about multi-connections.

Example:

 Clear::SQL.init("postgres://postgres@localhost/database_1")
 Clear::SQL.init("secondary", "postgres://postgres@localhost/database_2")

class ModelA
  include Clear::Model

  # Performs all the queries on `database_1`
  # self.connection = "default"
  column id : Int32, primary: true, presence: false
  column title : String
end

class ModelB
  include Clear::Model

  # Performs all the queries on `database_2`
  self.connection = "secondary"

  column id : Int32, primary: true, presence: false
end

def self.create(x : Array(NamedTuple)) : Array(self) #

Multi-models creation. See Collection#create(**args)

Returns the list of newly created model.

Each model will call an INSERT query. You may want to use Collection#import to insert multiple model more efficiently in one query.


[View source]
def self.create!(x : Array(NamedTuple)) : Array(self) #

Multi-models creation. See Collection#create!(**args)

Returns the list of newly created model. Raises exception if any of the model has validation error.


[View source]
def self.find(x) #

Returns a model using primary key equality Returns nil if not found.


[View source]
def self.find!(x) #

Returns a model using primary key equality. Raises error if the model is not found.


[View source]
def self.import(array : Enumerable(self), on_conflict : Clear::SQL::InsertQuery -> | Nil = nil) #

Import a bulk of models in one SQL insert query. Each model must be non-persisted.

on_conflict callback can be optionnaly turned on to manage constraints of the database.

Note: Old models are not modified. This method return a copy of the models as saved in the database.

Example:


 users = [ User.new(id: 1), User.new(id: 2), User.new(id: 3)]
 users = User.import(users)

[View source]
def self.polymorphic? : Bool #

def self.query #

Return a new empty query SELECT * FROM [my_model_table]. Can be refined after that.


[View source]
def self.read_only=(read_only : Bool) #

def self.read_only? : Bool #

def self.schema : Clear::SQL::Symbolic | Nil #

Define the current schema used in PostgreSQL. The value is nil by default, which lead to non-specified schema during the querying, and usage of "public" by PostgreSQL.

This property can be redefined on initialization. Example:

  class MyModel
    include Clear::Model

    self.schema = "my_schema"
  end
  MyModel.query.to_sql # SELECT * FROM "my_schema"."my_models"

def self.schema=(schema : Clear::SQL::Symbolic | Nil) #

Define the current schema used in PostgreSQL. The value is nil by default, which lead to non-specified schema during the querying, and usage of "public" by PostgreSQL.

This property can be redefined on initialization. Example:

  class MyModel
    include Clear::Model

    self.schema = "my_schema"
  end
  MyModel.query.to_sql # SELECT * FROM "my_schema"."my_models"

def self.table : Clear::SQL::Symbolic #

Return the table name setup for this model. By convention, the class name is by default equals to the pluralized underscored string form of the model name. Example:

  MyModel => "my_models"
  Person => "people"
  Project::Info => "project_infos"

The property can be updated at initialization to a custom table name:

  class MyModel
    include Clear::Model

    self.table = "another_table_name"
  end
  MyModel.query.to_sql # SELECT * FROM "another_table_name"

def self.table=(table : Clear::SQL::Symbolic) #

Return the table name setup for this model. By convention, the class name is by default equals to the pluralized underscored string form of the model name. Example:

  MyModel => "my_models"
  Person => "people"
  Project::Info => "project_infos"

The property can be updated at initialization to a custom table name:

  class MyModel
    include Clear::Model

    self.table = "another_table_name"
  end
  MyModel.query.to_sql # SELECT * FROM "another_table_name"

Instance Method Detail

def _cached_table : Clear::Reflection::Table | Nil #

def attributes : Hash(String, Clear::SQL::Any) #

Attributes, used when fetch_columns is true


def cache : Clear::Model::QueryCache | Nil #

def changed? #

Return true if the model is dirty (e.g. one or more fields have been changed.). Return false otherwise.


def clear_change_flags #

Reset the #changed? flag on all columns

The model behave like its not dirty anymore and call to save would apply no changes.

Returns self


def column_name : String #

Returns the value of #column_name column or throw an exception if the column is not defined.


def column_name=(x : String) #

Setter for #column_name column.


Returns the column object used to manage #column_name field

See Clear::Model::Column


def reset(h : Hash(Symbol, _)) #

Set the columns from hash


def reset(h : Hash(String, _)) #

Set the model fields from hash


def reset(t : NamedTuple) #

def reset(from_json : JSON::Any) #

def reset(**t : **T) forall T #

reset flavors


def set(h : Hash(Symbol, _)) #

Set the columns from hash


def set(h : Hash(String, _)) #

Set the model fields from hash


def set(t : NamedTuple) #

def set(from_json : JSON::Any) #

def set(**t : **T) forall T #
Description copied from module Clear::Model::HasColumns

Set one or multiple columns to a specific value This two are equivalents:

model.set(a: 1)
model.a = 1

def table : Clear::Reflection::Table | Nil #

The method table is a belongs_to relation to Clear::Reflection::Table



def table=(model : Clear::Reflection::Table | Nil) #

def table_catalog : String #

Returns the value of #table_catalog column or throw an exception if the column is not defined.


def table_catalog=(x : String) #

Setter for #table_catalog column.


Returns the column object used to manage #table_catalog field

See Clear::Model::Column


def table_name : Union(String, Nil) #

Returns the value of #table_name column or throw an exception if the column is not defined.


def table_name=(x : Union(String, Nil)) #

Setter for #table_name column.


def table_name_column : Clear::Model::Column(Union(String, Nil), Clear::Model::Converter::StringConverter) #

Returns the column object used to manage #table_name field

See Clear::Model::Column


def table_schema : String #

Returns the value of #table_schema column or throw an exception if the column is not defined.


def table_schema=(x : String) #

Setter for #table_schema column.


Returns the column object used to manage #table_schema field

See Clear::Model::Column


def to_h(full = false) : Hash(String, Clear::SQL::Any) #

Return a hash version of the columns of this model.


def to_json(emit_nulls : Bool = false) #

def to_json(json, emit_nulls = false) #

def update_h : Hash(String, Clear::SQL::Any) #

Generate the hash for update request (like during save)


def validate_fields_presence #

For each column, ensure than when needed the column has present information into it.

This method is called on validation.