User
Inherits Lustra::Model < Lustra::Model::FullTextSearchable < Lustra::Model::JSONDeserialize < Lustra::Model::Initializer < Lustra::Model::HasFactory < Lustra::Model::Introspection < Lustra::Model::ClassMethods < Lustra::Model::HasScope < Lustra::Model::HasRelations < Lustra::Model::HasValidation < Lustra::Validation::Helper < Lustra::Model::HasSaving < Lustra::Model::HasSerialPkey < Lustra::Model::HasTimestamps < Lustra::Model::HasColumns < Lustra::Model::HasHooks < Lustra::Model::Connection < Lustra::ErrorMessages < Reference < Object
Constants
Constructors
Build a new empty model and fill the columns using the NamedTuple in argument.
Returns the new model
Build a new empty model and fill the columns using the NamedTuple in argument.
Returns the new model
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.
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.
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.
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.
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.
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.
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.
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.
Class methods
Build a new empty model and fill the columns using the NamedTuple in argument.
Returns the new model
Build a new empty model and fill the columns using the NamedTuple in argument.
Returns the new model
Build a new empty model and fill the columns using the NamedTuple in argument.
Returns the new model
Define on which connection the model is living. Useful in case of models living in different databases.
Is set to "default" by default.
See Lustra::SQL#init(URI, *opts) for more information about multi-connections.
Example:
Lustra::SQL.init("postgres://postgres@localhost/database_1")
Lustra::SQL.init("secondary", "postgres://postgres@localhost/database_2")
class ModelA
include Lustra::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 Lustra::Model
# Performs all the queries on `database_2`
self.connection = "secondary"
column id : Int32, primary: true, presence: false
end
Define on which connection the model is living. Useful in case of models living in different databases.
Is set to "default" by default.
See Lustra::SQL#init(URI, *opts) for more information about multi-connections.
Example:
Lustra::SQL.init("postgres://postgres@localhost/database_1")
Lustra::SQL.init("secondary", "postgres://postgres@localhost/database_2")
class ModelA
include Lustra::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 Lustra::Model
# Performs all the queries on `database_2`
self.connection = "secondary"
column id : Int32, primary: true, presence: false
end
Create a new model from json and save it. Returns the model.
The model may not be saved due to validation failure;
check the returned model's errors? and persisted? flags.
Trusted flag set to true will allow mass assignment without protection, FALSE by default
Create a new model from json and save it. Returns the model.
Returns the newly inserted model Raises an exception if validation failed during the saving process. Trusted flag set to true will allow mass assignment without protection, FALSE by default
Find multiple models by an array of primary keys. Returns an array of models (may be empty if none found).
users = User.find([1, 2, 3])
users.size # => 0..3 depending on how many were found
Find multiple models by an array of primary keys. Raises error if ANY of the IDs are not found.
users = User.find!([1, 2, 3]) # Raises if any ID is not found
Find a model by column values. Returns nil if not found.
This is an alias for query.find(**tuple) with better naming.
user = User.find_by(email: "test@example.com")
user = User.find_by(first_name: "John", last_name: "Doe")
Find a model by column values. Returns nil if not found.
This is an alias for query.find(**tuple) with better naming.
user = User.find_by(email: "test@example.com")
user = User.find_by(first_name: "John", last_name: "Doe")
Find a model by column values. Raises error if not found.
This is an alias for query.find!(**tuple) with better naming.
user = User.find_by!(email: "test@example.com")
Find a model by column values. Raises error if not found.
This is an alias for query.find!(**tuple) with better naming.
user = User.find_by!(email: "test@example.com")
Create a new empty model and fill the columns from json. Returns the new model
Trusted flag set to true will allow mass assignment without protection, FALSE by default
Return the fully qualified and escaped name for this table. Add schema if schema is different from 'public' (default schema).
ex: "schema"."table"
Import a batch of models in one SQL insert query. Each model must be non-persisted.
on_conflict callback can be optionally enabled to manage database
constraints.
Note: Old models are not modified. This method returns 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)
Insert one row with one SQL statement.
This bypasses model instantiation, validations, and callbacks.
Insert many rows with one SQL statement.
This bypasses model instantiation, validations, and callbacks.
By default, duplicate rows are skipped by any unique index PostgreSQL
reports during ON CONFLICT DO NOTHING.
Return an empty, chainable collection (Rails-like .none).
Useful for conditional branches where no records should be returned
while keeping query chaining intact.
User.none.where { active == true }.count # => 0
Return a new query SELECT * FROM [my_model_table]. It can be refined after that.
Automatically applies default_scope if defined.
Register a counter cache for this model using model class
Reset counter cache columns to their correct values. This is useful when counter caches become out of sync due to direct SQL operations.
Example:
User.reset_counters(user.id, Post)
User.reset_counters(user.id, Post, Comment)
Define the current PostgreSQL schema. The value is nil by default,
which means no schema is specified during querying, so PostgreSQL uses
"public".
This property can be redefined on initialization. Example:
class MyModel
include Lustra::Model
self.schema = "my_schema"
end
MyModel.query.to_sql # SELECT * FROM "my_schema"."my_models"
Define the current PostgreSQL schema. The value is nil by default,
which means no schema is specified during querying, so PostgreSQL uses
"public".
This property can be redefined on initialization. Example:
class MyModel
include Lustra::Model
self.schema = "my_schema"
end
MyModel.query.to_sql # SELECT * FROM "my_schema"."my_models"
Return the table name configured for this model. By convention, the class name defaults 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 Lustra::Model
self.table = "another_table_name"
end
MyModel.query.to_sql # SELECT * FROM "another_table_name"
Return the table name configured for this model. By convention, the class name defaults 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 Lustra::Model
self.table = "another_table_name"
end
MyModel.query.to_sql # SELECT * FROM "another_table_name"
Insert or update a single row by conflict target.
This bypasses validations and callbacks, like Rails' upsert.
Use save with an on_conflict block when lifecycle hooks are needed.
Insert or update a single row by array conflict target.
Insert or update a single row by composite conflict target.
Model.upsert({tenant_id: 1, slug: "intro", title: "Intro"}, unique_by: {:tenant_id, :slug})
Insert or update many rows by conflict target.
Returns the rows saved by PostgreSQL's RETURNING *.
Insert or update many rows by array conflict target.
Returns the rows saved by PostgreSQL's RETURNING *.
Insert or update many rows by composite conflict target.
Returns the rows saved by PostgreSQL's RETURNING *.
Instance methods
Add a built association to track for autosave
Attributes used when fetch_columns is true.
Track built associations for autosave functionality
Track built associations for autosave functionality
Returns an array of names of all changed attributes.
user.email = "new@test.com"
user.first_name = "John"
user.changed # => ["email", "first_name"]
Return true if the model is dirty (e.g. one or more fields
have been changed.). Return false otherwise.
Returns a hash of all changed attributes with their [old_value, new_value].
user.email = "new@test.com"
user.first_name = "John"
user.changes # => {"email" => ["old@test.com", "new@test.com"], "first_name" => [nil, "John"]}
Reset the changed? flag on all columns
The model behaves as if it is no longer dirty, and calling save would apply no changes.
Returns self
Returns the value of created_at column or throw an exception if the column is not defined.
Setter for created_at column.
Returns the column object used to manage created_at field
See Lustra::Model::Column
Returns the value of first_name column or throw an exception if the column is not defined.
Setter for first_name column.
Returns the column object used to manage first_name field
See Lustra::Model::Column
Returns the value of id column or throw an exception if the column is not defined.
Setter for id column.
Returns the column object used to manage id field
See Lustra::Model::Column
Returns the value of language_code column or throw an exception if the column is not defined.
Setter for language_code column.
Returns the column object used to manage language_code field
See Lustra::Model::Column
Returns the value of last_name column or throw an exception if the column is not defined.
Setter for last_name column.
Returns the column object used to manage last_name field
See Lustra::Model::Column
The method messages is a has_many relation to Message
Returns the value of messages_count column or throw an exception if the column is not defined.
Setter for messages_count column.
Returns the column object used to manage messages_count field
See Lustra::Model::Column
reset flavors
Reset counter cache columns
Example:
user = User.find(1)
user.reset_counters(Post)
user.reset_counters(Post, Comment)
Set one or multiple columns to a specific value These two are equivalent:
model.set(a: 1)
model.a = 1
Set the fields from json passed as argument Trusted flag set to true will allow mass assignment without protection, FALSE by default
Returns the value of telegram_id column or throw an exception if the column is not defined.
Setter for telegram_id column.
Returns the column object used to manage telegram_id field
See Lustra::Model::Column
Return a hash version of the columns of this model.
Updates timestamp columns without triggering validations or callbacks.
user.touch # Updates updated_at
user.touch(2.days.ago) # Updates updated_at to specific time
Updates the specified column and updated_at without triggering validations or callbacks.
user.touch(:last_login_at) # Updates last_login_at and updated_at
user.touch(:last_seen_at, 1.hour.ago)
Updates multiple timestamp columns without triggering validations or callbacks.
user.touch([:last_login_at, :last_seen_at])
user.touch([:last_login_at, :last_seen_at], 3.days.ago)
Updates multiple timestamp columns at once.
user.touch(:last_login_at, :last_seen_at)
user.touch(:last_login_at, :last_seen_at, time: 1.day.ago)
Set the fields from json passed as argument and call save on the object
Trusted flag set to true will allow mass assignment without protection, FALSE by default
Set the fields from json passed as argument and call save! on the object
Trusted flag set to true will allow mass assignment without protection, FALSE by default
Generate the hash for an update request (like during save).
Returns the value of updated_at column or throw an exception if the column is not defined.
Setter for updated_at column.
Returns the column object used to manage updated_at field
See Lustra::Model::Column
Returns the value of username column or throw an exception if the column is not defined.
Setter for username column.
Returns the column object used to manage username field
See Lustra::Model::Column
For each column, ensure the column has presence information when needed.
This method is called on validation.