#sql #ruby-on-rails #ruby-on-rails-3 #activerecord
#sql #ruby-on-rails #ruby-on-rails-3 #activerecord
Вопрос:
Допустим, у меня есть модель, Foo
которая большая и содержит множество компонентов. Для данного Ajax-запроса меня интересует только один конкретный атрибут, bar
который является столбцом в таблице foos.
Есть ли простой способ, которым я мог бы загрузить только этот атрибут и не беспокоиться о получении остальной части записи? Например, если все, что я хочу знать, это панель для Foo с идентификатором #__, как я могу это получить?
Ответ №1:
Вы можете возвращать только определенные столбцы, вызывая select
метод со строкой, содержащей атрибуты, которые вы хотите вернуть. Для вашего примера:
Foo.select('bar').first #<Foo bar: 1>
Имейте в виду, что эти объекты будут действовать как обычные объекты ActiveRecord, но возвращать nil
для любого поля, которое вы не выбирали, поэтому будьте осторожны, используя эту функциональность.
Вы можете вызвать select для самого имени класса или любого отношения, так что вы можете объединить в цепочку вызовы ActiveRecord, которые вы обычно используете, например where
, и т.д.
Ответ №2:
Я предпочитаю это
User.where(:id => user_id).pluck(:user_name).first #'tom'
Foo.where(:age => 23).pluck(:user_name) #['tom', 'jerry', ...]
Комментарии:
1.
where.pluck.first
выглядит сложнее, но предотвращает ненужное создание экземпляра модели
Ответ №3:
Foo.where(<condition>).select('fieldname')
Пример
results = Foo.where('is_active = ?', true).select('bar')
Получите доступ к выбранным полям как:
results.map {|res| res.bar}
возвращает массив bar’ов
Комментарии:
1. очень сложное решение, попробуйте это one — User.where(:id => user_id).pluck(:имя_пользователя).first
Ответ №4:
pluck(*column_names)
документ: http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck
например Foo.pluck(:bar)
Ответ №5:
pick(*column_names)
выберите столбцы только одной верхней строки, docs
Аналогично pluck
, но извлекает только одну строку