Como buscar tópicos ordenados pelo valor do campo personalizado iso8601?

O limit(10) já deve fazer isso :slight_smile:

Algo assim deve funcionar: (mas não foi testado)

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)

O problema é que pedir ao PostgreSQL para converter a string de data em um timestamp será muito ineficiente. Ele terá que fazer a conversão para cada tópico individualmente antes de selecionar os primeiros 10.

Existem algumas opções que consigo pensar: você pode armazenar as datas como “segundos desde a época”, em vez de ISO8601. Isso tornará a ordenação pelo PostgreSQL muito mais fácil. Ou talvez seja possível usar uma migração de banco de dados para adicionar um índice à tabela topic_custom_fields para TIMESTAMP value.