2013-06-11 2 views
1

Я использую Sinatra и Sequel с PostgreSQL.Как использовать Sequel для выбора одного поля из базы данных

После аутентификации я хочу приветствовать пользователя, напечатав его имя, но я не могу получить только значение имени пользователя из базы данных, оно выходит как хэш.

Этот запрос:

current_user = DB[:users].select(:username).where('password = ?', password).first 

и полученный фрагмент данных:

Welcome, {:username=>"Rich"} 

, который выглядит довольно странно, я бы предпочел, чтобы читать "Добро пожаловать, Rich".

Что я здесь делаю неправильно? Я попробовал один и тот же запрос без «первого» в конце, и это не работает, либо

+1

Определяет, что вы должны использовать 'current_user [: username]'. –

+0

Спасибо за ваш совет. Решено: DB ['выберите имя пользователя от пользователей, где email_address =?', Email_address] .each do | row | current_user = row [: username] ..... end Как и PHP. Лол! – user1903663

+0

Конечно! current_user [: имя пользователя] тоже работает. Вы видите, что я новичок в рубине и взаимодействии с базами данных в стиле ORM, поэтому для меня это немного загадка. Во всяком случае, ура! – user1903663

ответ

1

Вы можете потянуть (один) столбец, выбранный из Hash даешься:.

current_user = DB[:users].select(:username).where('password=?', password).first[:username] 

Или вы можете map your results на массив имен пользователей и вытащить первый:

# Using a hash in the filter method is simpler than SQL placeholders. 
current_user = DB[:users].filter(password:password).select_map(:username).first 

Но самый лучший способ, чтобы получить only the user you care about, а затем получить имя:

# Using [] on a dataset returns the first row matching the criteria 
current_user = DB[:users][password:password][:username] 
+0

спасибо, как всегда ... – user1903663

Смежные вопросы