Files
fizzy/app/models/bubble/assignable.rb
T
David Heinemeier Hansson eb0614c44f Use a more ergonomic API for watching
Passing a boolean vs using explicit on/off methods feel too low level
and doesnt read right in most of these cases.
2025-04-06 19:17:26 +02:00

36 lines
1.0 KiB
Ruby

module Bubble::Assignable
extend ActiveSupport::Concern
included do
has_many :assignments, dependent: :delete_all
has_many :assignees, through: :assignments
scope :unassigned, -> { where.missing :assignments }
scope :assigned_to, ->(users) { joins(:assignments).where(assignments: { assignee: users }).distinct }
scope :assigned_by, ->(users) { joins(:assignments).where(assignments: { assigner: users }).distinct }
end
def toggle_assignment(user)
assigned_to?(user) ? unassign(user) : assign(user)
end
def assigned_to?(user)
assignments.exists? assignee: user
end
private
def assign(user)
assignments.create! assignee: user, assigner: Current.user
watch_by user
track_event :assigned, assignee_ids: [ user.id ]
rescue ActiveRecord::RecordNotUnique
# Already assigned
end
def unassign(user)
destructions = assignments.destroy_by assignee: user
track_event :unassigned, assignee_ids: [ user.id ] if destructions.any?
end
end