Ciprian Redinciuc
Joined
Activity
Posted in Recording pattern (Basecamp 3)
Yep, you are right, I kind of misses this detail. https://www.youtube.com/watch?v=lEUkarkROv0
The Event class also has a previous_recordable
which means that the recording accesses its recordables through events, leaving Recordables be completely separated from the business logic.
Posted in Recording pattern (Basecamp 3)
There's also this video, where they go through the Buckets & Recordings patterns.
https://www.youtube.com/watch?v=tmWlm0M6JSk&t=3309s
Indeed, it seems that I will have to use Events to keep track of changes and present them.
I thought that I will be able to do that using just recordings and recordables.
I guess the only way to properly clean up the database when a recording is deleted and delete any associated recordables is to have a trashed
property that will trigger a job. And I guess that here: https://www.youtube.com/watch?v=AoxoPfilKqE&t=1185s the @recordable.recordings
is just a Recording.where(recordable: self)
, therefore, a delegated_type is sufficient and a Recordable does not need to point to a Recording, even though I am not 100% sure of that because, in the previous class, Recording::Incineratable::Incineration, the incinerate_recordables
method is hidden and it has 13 lines of code, so it's not just another simple call.
Posted in Recording pattern (Basecamp 3)
Yes, Basecamp has something along the lines of:
def record(recordable, children: nil, parent: nil, creator: Current.person, **options)
transaction do
recordable.save!
options.merge!(recordable: recordable, parent: parent, creator: creator)
recordings.create!(options).tap do |recording|
Array(children).each do |child|
record child, parent: recording, status: status, creator: creator
end
end
end
end
What I cannot yet figure is how to create a relationship from a Recordable, which can be anything, to a Recording.
module Recordable
extend ActiveSupport::Concern
TYPES = %w[ Conversation Message Device ]
included do
has_one :recording, as: :recordable, inverse_of: :recordable, touch: true
end
end
class Recording < ApplicationRecord
include Tree
include Accountable, Readable, Recordables
belongs_to :mobile_application, touch: true
belongs_to :creator, class_name: "Person", default: -> { Current.person }
delegated_type :recordable, types: Recordable::TYPES, inverse_of: :recording
end
module Recordables
extend ActiveSupport::Concern
included do
after_commit :update_recordable, on: [:create, :update]
end
def recordables
recordable_type.constantize.where(recording_id: id)
end
private
def update_recordable
recordable.update! recording_id: self.id
end
end
The reason I need this is to be able to delete the recordables along with the recording.
I will probably have to do it in a after_commit on destory, but I will probably have to do it in a job.
Hope this helps.
Posted in Recording pattern (Basecamp 3)
Hello, you can find a repo that puts these bits and pieces together here: https://github.com/dixpac/camp
Hope it helps!