engineering,

Running a local Ruby Script in Heroku

Awin Awin Dec 10, 2017 · 2 mins read
Share this

Sometimes you require to run a local ruby script in your heroku server and get some result out of it directly in your local machine. There are a few options available for this sort of thing.

Running a local ruby script in Heroku console

Consider this scenario. You have a Rails app hosted in Heroku and need to find out the number of signups every day. You can always open up heroku console and run it by pasting the ActiveRecord count of users. But if you have a ruby script in your local you can pipe it to heroku console and get the output directly in your terminal.

# File ~/MyScripts/daily-signups.rb

user_count = User.where('created_at > ?', Date.current).count
user_emails = User.where('created_at > ?', Date.current).map(&:email)

puts "Total signups today #{user_count}"
puts "Signedup user emails #{user_emails.join(',')}"

You can run this in Heroku console as


cat ~/MyScripts/daily-signups.rb | heroku run console --app heroku-app-name --no-tty

This will give you a the required output directly in your terminal.

Running a ruby script to connect to the database

You can get the database credentials of your app using the Heroku cli


heroku pg:credentials

Then write a script to connect to the database as follows(assuming postgres):


# File ~/rails_app/scripts/user_signups.rb

require 'active_record'

ActiveRecord::Base.establish_connection(
  adapter: 'postgresql',
  encoding: 'unicode',
  database: 'abcd-databasename',
  host: 'ec2-123-123-123-123.compute-1.amazonaws.com',
  pool: 5,
  username: 'username',
  password: 'password'
)

results = ActiveRecord::Base.connection.execute(<<-EOQ)
  SELECT  name, email FROM users WHERE created_at >= CURRENT_DATE
EOQ

results.each do |row|
  puts row['name']
  puts row['email']
end

This can be run using the ruby interpreter as follows:

 bundle exec ruby scripts/report2.rb

Note (If you are running it in your rails project using bundle exec need not require explicit gem install active_record )

The second approach seems to be faster, when compared to the first.

Awin
Written by Awin Follow
Hi, I am Awin, founder at Neumeral. Please reachout to me for any feedback / questions.