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

89

редактировать 2

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


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

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

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

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

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

Спасибо

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

тимпоне
источник

Ответы:

86

В 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-запрос и затем отправляют его.

Jefflunt
источник
но мне нужен только один экземпляр, а не все
Timpone
Я отредактировал свой ответ. :limitдолжен это сделать, или :firstили :lastили любой другой , в зависимости от того, что вы хотите. Справочный документ, на который я ссылаюсь, расскажет вам, как все это сделать.
jefflunt
Обновлено, чтобы
показать,
205

сорвать (имя_столбца)

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

прасад. суразе
источник
1
Хорошо, срывать с несколькими столбцами - это здорово .. только что узнал об этом из этого ответа. Однако Rails 3 нуждается в принятом ответе.
Джей Шеперд
Принятый ответ верен, потому что в то время «сорвать» не было.
prasad.surase 06
User.pluck (: email,: id) ВЫБЕРИТЕ «пользователей». «Электронная почта», «пользователи». «Id» ИЗ «пользователей»
пранав прашант
2
Model.uniq теперь Model.distinct (по крайней мере, в Rails 5).
mrturtle
Кажется, вы можете сделать следующее в rails 3.2: Location.select([:name, :website, :city])если вы передадите ему массив
CTS_AE
24

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

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

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

tkhuynh
источник
Это должен быть выбранный ответ, который наиболее прямо отвечает на вопрос.
Майкл Уилтбэнк