Ruby-on-Rails: выбор отдельных значений из модели

Документы: http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields

Ясно, что:

query = Client.select(:name).distinct
# => Returns unique names

Однако, когда я пытаюсь это сделать в своем контроллере, я получаю следующую ошибку:

undefined method `distinct' for #<ActiveRecord::Relation:0xb2f6f2cc>

Чтобы быть ясным, мне нужны разные имена, например [ "Джордж", "Брэндон" ], а не фактические записи клиентов. Есть что-то, чего я не хватает?

Ответ 1

Опция .distinct была добавлена для rails 4, к чему относятся последние руководства.

Рельсы 2

Если вы все еще на рельсах 2, вам нужно использовать:

Client.select('distinct(name)')

Рельсы 3

Если вы находитесь на Rails 3, вам нужно использовать:

Client.select(:name).uniq

Если вы посмотрите на эквивалентный раздел направляющих рельсов 3, вы увидите разницу между двумя версиями.

Ответ 2

Это будет работать для Rails 2 (довольно старые рельсы, которые я знаю!), 3 и 4.

Client.select('distinct(name)')

Это на самом деле будет использовать SQL выбрать отдельный оператор

SELECT distinct name FROM clients

Ответ 3

Если вы не хотите возвращать ActiveRecord:: Relations, просто массив имен в виде строк, используйте:

Client.distinct.pluck(:name)

Чтобы получить упорядоченный набор результатов:

Client.order(:name).distinct.pluck(:name)

Ответ 4

Есть несколько подходов:

  1. Рельсы путь:

    Model.select(:name).distinct
    
  2. Полуральевой путь

    Model.select("DISTINCT ON(name) models.*")
    

Вторая позволяет выбрать первую запись, уникальную по имени, но в целом не только по именам.