limit(10) уже должно это обеспечить ![]()
Вот что-то вроде этого должно помочь (но не тестировалось):
Topic.where("category_id in (?)", [cat_id])
.where("closed = ?", false)
.joins("LEFT JOIN topic_custom_fields import_tcf ON import_tcf.topic_id = topic.id AND topic_custom_fields.name = 'importedSortDate'")
.order("TIMESTAMP import_tcf.value")
.order("created_at desc")
.limit(10)
Проблема в том, что заставлять PostgreSQL преобразовывать строку даты в метку времени будет очень неэффективно. Ему придется выполнять конвертацию для каждой отдельной темы, а затем выбирать первые 10.
Я могу предложить несколько вариантов — можно хранить даты как «секунды с начала эпохи», а не в формате ISO8601. Это сделает их гораздо проще для сортировки в PostgreSQL. Либо вы можете использовать миграцию базы данных, чтобы добавить индекс в таблицу topic_custom_fields для TIMESTAMP value.