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
Есть несколько подходов:
-
Рельсы путь:
Model.select(:name).distinct
-
Полуральевой путь
Model.select("DISTINCT ON(name) models.*")
Вторая позволяет выбрать первую запись, уникальную по имени, но в целом не только по именам.