ActiveRecord находит и возвращает только выбранные столбцы - PullRequest
83 голосов
/ 27 октября 2011

edit 2

Если вы наткнетесь на это, отметьте оба ответа, так как я теперь использовал бы pluck для этого


У меня есть довольно большой пользовательский набор данных, который я хотел бывернуться, чтобы быть echoe'd вне как json.Одна часть:

l=Location.find(row.id)
tmp[row.id]=l

, но я хотел бы сделать что-то вроде:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

, но это, похоже, не работает.Как мне заставить это работать?

thx

edit 1
альтернативно, есть ли способ, которым я могу передать массив только тех атрибутов, которые я хочувключено

Ответы [ 3 ]

199 голосов
/ 11 октября 2012

pluck (имя-столбца)

Этот метод предназначен для выполнения выбора по одному столбцу в качестве прямого запроса SQL. Возвращает массив со значениями указанного имени столбца.колонка.

Примеры:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

см. http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

Введены рельсы 3.2 и далее и допускается только один столбецВ рельсах 4 он принимает несколько столбцов

81 голосов
/ 27 октября 2011

In Rails 2

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

... или ...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

Этот справочный документ дает вам полный список опций, которые вы можете использоватьс .find, включая ограничение по числу, идентификатору или любому другому произвольному столбцу / ограничению.

В Rails 3 с интерфейсом запросов ActiveRecord

l = Location.where(["id = ?", id]).select("name, website, city").first

Ссылка: Интерфейс запроса Active Record

Вы также можете поменять местами порядок этих связанных вызовов, выполнив .select(...).where(...).first - все эти вызовы - это создание запроса SQL и его отправка.

13 голосов
/ 07 июля 2017

Мой ответ приходит довольно поздно, потому что я довольно новый разработчик. Вот что вы можете сделать:

Location.select(:name, :website, :city).find(row.id)

Кстати, это Рельсы 4

...