Sentinel-free code that can be adapted for other purposes:

```ruby
class Event
  def started_at
    [event_start_date, event_start_time].map { |t| t || Unknown }
  end
end

class ContactLink
  def started_at
    [contact_date_date, contact_start_time].map { |t| t || Unknown }
  end
end

class Unknown
  def self.<=>(other)
    1
  end
end

class ParticipantsController
  def get_sorted_events_contact_links
    objects = # ...
    objects.sort_by(&:started_at)
  end
end
```

The trick is finding an appropriate name and place for `Unknown`.  That said, I'm pretty sure I've seen this "shove nils at the end of the list" elsewhere in Cases' views, which means it could live in a helper.