Rails: загрузить только один атрибут, а не всю модель

#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 , но извлекает только одну строку