it-swarm.com.ru

ActiveRecord находит и возвращает только выбранные столбцы

Правка 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

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

спасибо

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

83
timpone

В 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 Query Interface

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

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

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

81
jefflunt

срывать (column_name)

Этот метод предназначен для выполнения выбора по одному столбцу в качестве прямого запроса 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

Это введено Rails 3.2 и далее и принимает только один столбец. В Rails 4 он принимает несколько столбцов

199
prasad.surase

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

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

Кстати, это Rails 4

12
tkhuynh