Как мне создать массив данных из таблицы Users в активной записи Rails?

#ruby-on-rails #ruby #activerecord

#ruby-on-rails #ruby #activerecord

Вопрос:

У меня есть таблица User со столбцами full_name, email, phone, address, city, state, zip

Мне нужно создать массив из таблицы User, который содержит полное имя и адрес электронной почты в этом формате [«user1.full_name, user1.email», «user2.full_name, user2.email» и т. Д.]

У меня возникли проблемы с написанием этого запроса.

Это то, что у меня есть до сих пор

 #create empty arrays
full_names = []
emails = []
#populate the full_names array
user_full_name = User.all
user_full_name.each{|x| full_names<<x.full_name}
#populate the emails array
user_email = User.all
user_email.each{|x| emails<<x.email}

#combine the two arrays
full_names.zip(emails)
  

Но это дает мне многомерный массив
[[«full_name, email»], [«full_name, email»] и т. Д.]

Как мне получить его в формате [«full_name, email», «full_name, email» и т. Д.]

Ответ №1:

Вот два * возможных решения и их соответствующий SQL:

 # SELECT "users"."full_name", "users"."email" FROM "users"
User.pluck('full_name', 'email').map{ |u| u.join(', ')}.flatten

# SELECT "users".* FROM "users"
User.all.map { |u| "#{u.full_name}, #{u.email}" }
  

Это pluck более эффективно, чем all.map потому, что он выбирает только нужные вам атрибуты.

* Оба из которых были упомянуты в предыдущем ответе.

Ответ №2:

 User.all.map do |user|
  "#{user.full_name}, #{user.email}"
end
  

См. Array#map


Чтобы дать немного больше информации об этом. Когда вы используете ActiveRecord::QueryMethod (например, вы выполняете запрос через ActiveRecord), результат на самом деле не является массивом, однако он ведет себя как массив, и, вызывая для него метод array, вы извлекаете результаты (см. ActiveRecord::Relation ). Это был полный рот, но, надеюсь, следующие примеры будут понятнее:

 # This builds a query but doesn't actually fire it!
users = User.all

# chain onto the query - it still won't be fired yet
users = users.where.not(name: "Rick")

# see the query that will be run
users.to_sql

# check the type of this variable
users.class
# => ActiveRecord::Relation

# evaluates the query
users.count

# evaluates the query
users.to_a

# evaluates the query
users.any? { |user| user.email.nil? }

# evaluates the query
users.map { |user| user.full_name }

# evaluates the query
# does the same thing as the previous line
users.pluck(:first_name)