Разобрался сам с задачей.
Вот простенький плагин реализующий то, что мне нужно.
module Sequel
module Plugins
module I18nModel
def self.apply(model, opts={})
model.instance_eval do
@i18n_columns = opts[:i18n_columns]
end
end
module ClassMethods
def i18n(options = {})
locales = options[:locales].clone
locales << :locale
locales = locales.pg_array
ds = select
@i18n_columns.each do|c|
ds = ds.select_append(Sequel.lit("(array_remove(? -> ?, NULL))[1]", c, locales).as(c))
end
return ds
end
end
end
end
end
Для модели нужно будет вызвать метод i18n, в парамере locale передать массив локалей по приоритету. Всё за один запрос.