module Card::Pinnable extend ActiveSupport::Concern included do has_many :pins, dependent: :destroy after_update_commit :broadcast_pin_updates, if: :preview_changed? end def pinned_by?(user) pins.exists?(user: user) end def pin_for(user) pins.find_by(user: user) end def pin_by(user) pins.find_or_create_by!(user: user) end def unpin_by(user) pins.find_by(user: user).tap { it.destroy } end private def broadcast_pin_updates pins.find_each do |pin| pin.broadcast_replace_later_to [ pin.user, :pins_tray ], partial: "my/pins/pin" end end end