Rails - an array of users has been set - how to get only emails?

I have the following:

@users = User.all

The user has several fields, including email.

What I would like to do is get a list of all @users emails.

I tried:

@users.email.all but that errors w undefined

Ideas? Thanks

+3
source share
7 answers

(by popular request, posting as a real answer)

What I don't like about the fl00r solution is that it creates an instance of a new user object for each entry in the database; which just doesn't scale. This is great for a table with 10 emails, but once you start to infiltrate thousands, you will run into problems, mainly with Ruby memory consumption.

, connection.select_values ​​ ARel:

User.connection.select_values(User.select("email").to_sql)

. , User.select("email"), , " ". , , .

: String , User, . ( , ). , map .

Rails 2.3...

SQL , , .

User.connection.select_values("SELECT email FROM users")

, Rails 3.

+12
User.select(:email).map(&:email)
+6

connection.select_values ​​ , AR , Rails, : pluck.

, , :

User.pluck(:email)

select_values ​​ , , . , , ( 1 0), | .

pluck ARel, :

User.order('created_at desc').limit(5).pluck(:email)
+5

:

User.select("email")
+2

SO, . , , , .

Piggybacking Ryan , ActiveRecord:: Base, , .

config/initializers (, config/initializers/active_record.rb):

class ActiveRecord::Base
  def self.selected_to_array
    connection.select_values(self.scoped)
  end
end

AREL:

User.select('email').selected_to_array
User.select('email').where('id > ?', 5).limit(4).selected_to_array
+2

, :

@users.collect { |user| user.email }
# => ["test@example.com", "test2@example.com", ...]

:

@users.collect(&:email)
+1

User.all.map(&:email), ActiveRecord, , Ruby. .

, , , , Valium.

https://github.com/ernie/valium

.

User.all[:email]

, .

User.where(:subscribed => true)[:email].each do |email|
  puts "Do something with #{email}"
end

User.all.map(&:email) .

0

Source: https://habr.com/ru/post/1795600/


All Articles