Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Constants
CALLBACKS = {
before_save: [do
if (__temp_1232 = @group) && __temp_1232.new_record?
__temp_1232.save
self.group_id = __temp_1232.id.not_nil!
end
end, do
if (__temp_1234 = @playlist_item) && __temp_1234.new_record?
__temp_1234.save
self.playlist_item_id = __temp_1234.id.not_nil!
end
end] of
Nil,
after_save: [] of
Nil,
before_create: [do
self.created_at = self.updated_at =
Time.utc
end] of
Nil,
after_create: [] of
Nil,
before_update: [do
self.updated_at =
Time.utc
end] of
Nil,
after_update: [] of
Nil,
before_destroy: [] of
Nil,
after_destroy: [do
end, do
end] of
Nil,
}
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
PRIMARY_KEY_TYPES = {:group_id =>
UUID, :playlist_item_id =>
String} of
Nil =>
NilPRIMARY_KEYS = [{:group_id, :playlist_item_id}]
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Constructors
from_json(string_or_io :
String |
IO, trusted :
Bool = false) : self
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Deserializes the given JSON in string_or_io into
an instance of self, assuming the JSON consists
of an JSON object with key root, and whose value is
the value to deserialize. Will not deserialise from
fields with mass_assign: false
class User < ActiveModel::Model
attribute name : String
attribute google_id : UUID, mass_assign: false
end
User.from_json(%({"main": {"name": "Jason", "google_id": "f6f70bfb-c882-446d-8758-7ce47db39620"}}), root: "main") # => #<User:0x103131b20 @name="Jason">
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
from_trusted_json(string_or_io :
String |
IO) : self
Serialize from a trusted JSON source
from_trusted_yaml(string_or_io :
String |
IO) : self
Serialize from a trusted YAML source
from_yaml(string_or_io :
String |
IO, trusted :
Bool = false) : self
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
SourceJunction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Sourcenew(rs : DB::ResultSet)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
new(created_at :
Time |
ActiveModel::Model::None = ::
ActiveModel::Model::None.new, updated_at :
Time |
ActiveModel::Model::None = ::
ActiveModel::Model::None.new, group_id :
UUID |
ActiveModel::Model::None = ::
ActiveModel::Model::None.new, playlist_item_id :
String |
ActiveModel::Model::None = ::
ActiveModel::Model::None.new)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Initialize PlaceOS::Model::GroupPlaylistItem from HTTP::Params.
Class methods
attributes
Returns all attribute keys.
Changefeed at row (if id passed) or whole table level.
Returns a ChangeFeed instance which can be used to invoke async callbacks via on or
use blocking Iterator via each method.
from_rs(__temp_2388 : DB::ResultSet)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
primary_key
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Sourcetable_name
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Instance methods
after_create
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
after_destroy
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
after_initialize(trusted :
Bool)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
after_save
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
after_update
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
apply_defaults
Generate code to apply default values
assign_attributes(created_at :
Time |
Missing =
Missing, updated_at :
Time |
Missing =
Missing, group_id :
UUID |
Missing =
Missing, playlist_item_id :
String |
Missing =
Missing)
Assign to multiple attributes.
Assign to multiple attributes via HTTP::Params.
Assign to multiple attributes from a model object
assign_attributes_from_json(json, root :
String)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
assign_attributes_from_json(json)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
assign_attributes_from_trusted_json(json, root :
String)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
assign_attributes_from_trusted_json(json)
Assign each field from JSON if field exists in JSON and has changed in model
assign_attributes_from_trusted_yaml(yaml)
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
assign_attributes_from_yaml(yaml)
Uses the YAML parser as JSON is valid YAML
attributes
Returns a Hash of all attribute values
attributes_tuple
Returns a NamedTuple of all attribute values.
before_create
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
before_destroy
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
before_save
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
before_update
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
changed?
Check if any attributes have changed.
changed_attributes
Returns a Hash with all changed attributes.
changed_json(io :
IO) :
Nil Serialize the set of changed attributes to JSON.
changed_json
Serialize the set of changed attributes to JSON.
changed_persist_attributes
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
changed_yaml(io :
IO) :
Nil Serialize the set of changed attributes to YAML.
changed_yaml
Serialize the set of changed attributes to YAML.
created_at=(value :
Time)
Setters
created_at setter
created_at?
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
created_at_assigned?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
created_at_change
Returns a Tuple of the previous and the current
value of an instance variable if it has changed
created_at_changed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
created_at_default
created_at's default value
created_at_removed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
created_at_was
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
created_at_will_change!
Include created_at in the set of changed attributes, whether it has changed or not.
group=(record : Group) : Group
Sourcegroup_id?
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
group_id_assigned?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
group_id_change
Returns a Tuple of the previous and the current
value of an instance variable if it has changed
group_id_changed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
group_id_removed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
group_id_was
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
group_id_will_change!
Include group_id in the set of changed attributes, whether it has changed or not.
id
Always returns this record's primary key value, even when the primary key
isn't named id
id?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
invoke_props
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
persistent_attributes
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
playlist_item=(record : Playlist::Item) : Playlist::Item
Sourceplaylist_item_id=(value :
String)
playlist_item_id?
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
playlist_item_id_assigned?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
playlist_item_id_change
Returns a Tuple of the previous and the current
value of an instance variable if it has changed
playlist_item_id_changed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
playlist_item_id_default
playlist_item_id's default value
Sourceplaylist_item_id_present?
playlist_item_id_removed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
playlist_item_id_was
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
playlist_item_id_will_change!
Include playlist_item_id in the set of changed attributes, whether it has changed or not.
primary_key
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
Sourceprimary_key_hash
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
restore_attributes
Reset each attribute to their previous values and clears all changes.
table_name
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
updated_at=(value :
Time)
updated_at?
NOTE: use getter / getter! (not property / property!) so that the
setter defined later in __create_initializer__ is the only setter on
the field. Crystal's overload resolution silently fails to replace a
property-defined setter with one of identical signature for generic
types (e.g. Set(String)?, Array(String)?, String | Array(String)),
although it does work for non-generic ones like String?. Defining the
setter only once via __create_initializer__ ensures change tracking,
sanitization, and custom setter blocks run uniformly across all types.
updated_at_assigned?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
updated_at_change
Returns a Tuple of the previous and the current
value of an instance variable if it has changed
updated_at_changed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
updated_at_default
updated_at's default value
updated_at_removed?
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
updated_at_was
Junction between Group (authority-scoped, UUID) and
Playlist::Item (authority-scoped, legacy TEXT PK). Same M:N shape
as GroupPlaylist but against individual media / plugin / webpage
items.
Presence-only — no per-row permission bitmask, no GroupHistory
audit. A user's capability on a linked item comes from their
GroupUser.permissions within the group.
Both sides must share an authority — enforced here at the model
layer (no single FK can express it).
updated_at_will_change!
Include updated_at in the set of changed attributes, whether it has changed or not.
validate_nilability
Validate that all non-nillable fields have values.