I would suggest to provide a dedicated column for this search. While that might create redundant data, it is way easier to search than doing some SQL magic on the existing columns.
You can easily automate the setting of this field:
before_save :set_full_name
def set_full_name
self.full_name = [first_name, middle_name, last_name].reject(&:blank?).join(" ")
end
Then you can use the normal ransack methods to search this field.