Как получить доступ к результату сиквела с помощью оператора точки в ruby?

Я новичок в сиквеле и рубине, и мне нужно кое-что помочь тебе. Одним словом, я не могу получить доступ к результату запроса к базе данных с помощью оператора точки. Я использую адаптер сиквела в проекте Padrino Ruby. Например,

persons = Person.all
persons.each do |p|
  puts p.name . # this output correct person name, as 'john'
end

Но если я сделаю какой-то запрос

persons = Person.where(:age=>20)
persons.each do |p|
  puts p.name . # this line cause error 
end

Я сравнил их типы данных, и они отличаются друг от друга.

puts persons  # in first case - array
#<Gig:0x007fbdb6d64ef0>
#<Gig:0x007fbdb6d64838>
#<Gig:0x007fbdb6d641f8>

puts persons  # in second case - object
#<Sequel::Postgres::Dataset:0x007fbdbc614898>

Поэтому я попытался изменить результат на хэш-массив во втором случае, чтобы получить доступ к полям с помощью оператора точки

persons_hash= persons.collect do |p|
  ro.to_hash
end

В этом случае я смог получить доступ к имени пользователя с person[0][:name], но не смог получить доступ с помощью оператора точки.

Итак, я хочу знать, как мне нужно сделать, чтобы получить доступ к результату запроса Sequel с помощью оператора точки.

Спасибо:)

0 ответов

persons.each do |p|
  puts p.name . # this line cause error 
end

Какую именно ошибку вы здесь получаете? Я предполагаю ошибку неопределенного метода? Кажется, вы знакомы с синтаксисом ActiveRecord. Сам сиквел не использовал, но он немного отличается от AR. Согласно их документам, вы бы сделали что-то вроде этого

persons.map(:name) # => ['Harry', 'Steve', 'Israel', ...]

Метод all возвращает массив хешей, каждый из которых соответствует записи.

В приведенном выше примере я бы попробовал следующее:

persons.each do |p|
  puts p[:name] . # here we are now accessing the name hash key instead of trying to access the name method.
end

Вы хотите получить доступ к ключу имени каждого повторяемого хэша. Потому что вы перебираете массив хэшей. Вот почему вы можете получить доступ к этим данным с помощьюperson[0][:name]. Вы вызывали 0-й элемент массива персонажей и получали доступ к его хэш-ключу name.

Другие вопросы по тегам