Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Standalone ruby -- How to load different environments from database.yml

I have a background process that modifies records in a database. The models connect to the database using something like this:

dbconfig = YAML::load(File.open('database.yml'))
ActiveRecord::Base.establish_connection(dbconfig["development"])
class Clcar < ActiveRecord::Base
 ....
end

All model classes have those lines at the top.

I agree that's a bad way of doing it.

  1. Is there a better way to get a connection to a model class? How do I pass the connection to the model?
  2. I want to be able to run my background process with a different environment, say "production".

How do I achieve that?

like image 750
truthSeekr Avatar asked May 05 '11 00:05

truthSeekr


People also ask

How can we use two databases to a single application rails?

Rails 6.0 ships with all the rails tasks you need to use multiple databases in Rails. Running a command like bin/rails db:create will create both the primary and animals databases.

What is ActiveRecord base?

ActiveRecord::Base indicates that the ActiveRecord class or module has a static inner class called Base that you're extending.

What is ActiveRecord in Ruby on rails?

What is ActiveRecord? ActiveRecord is an ORM. It's a layer of Ruby code that runs between your database and your logic code. When you need to make changes to the database, you'll write Ruby code, and then run "migrations" which makes the actual changes to the database.


2 Answers

I would set up the connection once at the start of your background process. Once you've established the connection once, all of the models will work correctly anyway.

Your connection establishment code would look something like this:

@environment = ENV['RACK_ENV'] || 'development'
@dbconfig = YAML.load(File.read('config/database.yml'))
ActiveRecord::Base.establish_connection @dbconfig[@environment]
like image 79
Jamie Penney Avatar answered Nov 15 '22 21:11

Jamie Penney


I'd recommend looking into using rails runner.

Runner scripts have access to everything, including the database, but without all the view stuff from the MVC model. They are great for back-end tasks or jobs that work on the database but don't have any interface.

You can also use rails rake instead, but I feel rake tasks are targeted at maintenance of the files and directories and for building structure, and runner scripts better for regular tasks, such as something you'd run from cron periodically.

I have one I use for retrieving logs from a site, parsing them, then injecting them into one of my databases. There's no reason to run the job as part of the Rails app because there was no need for an interface. Running as a runner script fit nicely.

The built-in help says:

Usage: runner [options] ('Some.ruby(code)' or a filename)

    -e, --environment=name           Specifies the environment for the runner to operate under (test/development/production).
                                     Default: development

    -h, --help                       Show this help message.

You can also use runner as a shebang line for your scripts like this:
-------------------------------------------------------------
#!/path/to/your/rails/app/script/rails runner

Product.find(:all).each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------

That last line:

Product.find(:all).each { |p| p.price *= 2 ; p.save! }

shows how easy it is.

like image 22
the Tin Man Avatar answered Nov 15 '22 21:11

the Tin Man