Возврат одного поля с помощью Rails Query - PullRequest
5 голосов
/ 03 марта 2012

У меня проблемы с чем-то, что должно быть так легко, но я не знаю, что я делаю неправильно. Я просто пытаюсь сделать запрос, который возвращает единственное поле вместо полной записи в Rails 3.

метод модели

def self.find_user_username(user_id)
  user_name = User.select("user_name").where(user_id)
  return user_name
end

Я смотрю на Rails Guide (http://guides.rubyonrails.org/active_record_querying.html#selecting-specific-fields) и он просто говорит (где viewable_by, locked = fields):

Client.select("viewable_by, locked")

Я попытался перевернуть выбранное, вот так:

User.select("user_name").where(user_id) - AND - 
User.where(user_id).select("user_name")

но ни одна не работает. На самом деле я даже попробовал:

user_name = User.select("yoda").where(user_id)

и я не получил ошибку. Когда я смотрю на вид, где у меня есть:

Friend.find_user_username(friend.user_id)

Я просто продолжаю получать хэш: ActiveRecord :: Relation: 0x2f4942f0

Ответы [ 6 ]

22 голосов
/ 03 марта 2012
User.where(:id => user_id).pluck(:user_name).first

Должен делать то, что вы пытаетесь сделать.

pluck"принимает имя столбца в качестве аргумента и возвращает массив значений указанного столбца с соответствующим типом данных"

1 голос
/ 03 марта 2012

Ваша проблема не в select, а в where.Ваше состояние сейчас по существу WHERE #{user_id}.Если вы выполните это на консоли Rails, вы увидите что-то вроде этого:

1.9.2p290 :003 > puts User.select('user_name').where(1).to_sql
SELECT user_name FROM "users" WHERE (1)

Вам нужно передать условия в виде хэша в where и взять первую запись, как предложили другие:

User.select('user_name').where(:id => user_id).first
1 голос
/ 03 марта 2012

Вам нужно добавить .first, чтобы запрос возвращал запись, поскольку where возвращает только отношение activerecord.

1.9.3p0 :048 > user = User.select('first_name').where('id = 1').first
  User Load (0.6ms)  SELECT first_name FROM `users` WHERE (id = 1) LIMIT 1
+------------+
| first_name |
+------------+
| Johnny     |
+------------+
1 row in set

1.9.3p0 :049 > user.first_name
=> "Johnny" 
0 голосов
/ 12 июля 2013

есть метод под названием 'pluck', см. http://apidock.com/rails/ActiveRecord/Calculations/pluck

0 голосов
/ 03 марта 2012

Кстати, если вопрос об ActiveRecord :: Relation, это класс объекта, возвращаемого функцией where, и выберите, как сказано в Руководстве по Rails, которое вы читаете.Он оптимизирован для цепочки между несколькими методами, и вы получаете объект модели, когда вы фактически получаете доступ к элементу ассоциации (поэтому за кулисами SQL-запрос выполняется только один раз).Это означает, что вы получаете объект Relation, потому что вы просто его возвращаете.

В этом случае, возможно, лучшее решение - просто использовать find и получить доступ к атрибуту user_name

def self.find_user_username(user_id)
  User.find(user_id).user_name
end

Запрос получит вседругие атрибуты из БД, но вы вернете только имя пользователя.

0 голосов
/ 03 марта 2012

Похоже, что, не возвращая каждое поле, запрос возвращает объект, а не значение определенного поля. Вы можете изменить возврат return user_name на return user_name.user_name.

def self.find_user_username(user_id)
  user_name = User.select("user_name").where(user_id)
  return user_name
end

Или вы можете увидеть, если User.user_name.where(user_id).first делает то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...