Я бы написал это, как показано ниже, используя AR:
class Category < ApplicationRecord
scope :first_in_locale, ->() {
joins(<<-SQL)
JOIN (SELECT locale, min(id) AS id FROM categories GROUP BY locale) b ON b.id = categories.id
SQL
.select('categories.*')
.order('categories.id')
}
end
В консоли Rails:
2.5.1 :010 > pp Category.first_in_locale
Category Load (0.9ms) SELECT categories.* FROM "categories" JOIN (SELECT locale, min(id) as id from categories group by locale) b on b.id = categories.id ORDER BY categories.id
[#<Category:0x00007fc597e3db68
id: 1,
name: "Sociability",
locale: "en",
created_at: Sun, 16 Sep 2018 07:47:34 UTC +00:00,
updated_at: Sun, 16 Sep 2018 07:47:34 UTC +00:00>,
#<Category:0x00007fc597e3d3e8
id: 3,
name: "社會性",
locale: "zh-TW",
created_at: Sun, 16 Sep 2018 07:47:34 UTC +00:00,
updated_at: Sun, 16 Sep 2018 07:47:34 UTC +00:00>]
Вот ответ SQL , который я завернул в ActiveRecord.