#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 претерпели серьезные изменения. К счастью, все определенно упростилось. Именно так я бы сделал это в наше время, но не помешает проверить, на какой версии вы работаете.