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

#ruby-on-rails #ruby-on-rails-3 #rails-activerecord

#ruby-on-rails #ruby-on-rails-3 #рельсы-activerecord

Вопрос:

редактировать 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
в качестве альтернативы, есть ли способ передать массив только тех атрибутов, которые я хочу включить?

Ответ №1:

выщипывание (имя_столбца)

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

Комментарии:

1. Хорошо, перебор с несколькими столбцами — это круто.. только что узнал об этом в этом ответе. Rails 3, однако, нуждается в принятом ответе.

2. Принятый ответ правильный, потому что тогда pluck был недоступен.

3. User.pluck(:email,: id) ВЫБЕРИТЕ «пользователи».»электронная почта», «пользователи».»идентификатор» ИЗ «пользователи»

4. Model.uniq теперь является Model.distinct (по крайней мере, в Rails 5).

5. Кажется, вы можете сделать следующее в rails 3.2: Location.select([:name, :website, :city]) если вы передадите ему массив

Ответ №2:

В 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
 

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

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

Комментарии:

1. но мне нужен только один экземпляр, а не все

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

3. Обновлено, чтобы включить, как выполнить эквивалентный запрос в Rails 3.

Ответ №3:

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

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

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

Комментарии:

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

2. Об этом спрашивали более 10 лет назад. Версии Rails и ActiveRecord претерпели серьезные изменения. К счастью, все определенно упростилось. Именно так я бы сделал это в наше время, но не помешает проверить, на какой версии вы работаете.