Igor Kasyanchuk
Posted on February 19, 2020
Hello,
As a developer, I need from time to time to quickly execute SQL, or check something in DB, truncate a table, etc when I'm in the rails console.
You may already know about using ActiveRecord::Base.connection.execute("SQL query")
solution, but I must admit I'm a lazy developer when it comes to doing routine tasks or things where I need to type long pieces of code. And actually a snippet of code above is not everything that you need to type, you may also need to add .to_a
to see the result of the query.
I know the following rule:
laziness is the engine of progress!
So, I tried to solve my issue as a developer and create an open-source solution to use it from project to project: https://github.com/igorkasyanchuk/execute_sql
This is a demo of how it works:
I'll explain how it works.
Step of creation gem I'll skip, but basically you need to create a new gem (rails plugin new <name>
).
Now we need to understand how to add our own method just in the rails console.
module ExecuteSql
class Railtie < ::Rails::Railtie
console do
TOPLEVEL_BINDING.eval('self').extend ExecuteSql::ConsoleMethods
end
end
end
This is a piece of code from my gem. You can see that Rails provides a helper method console
where you can pass the code which will be executed when you starting rails c
.
In our case this is TOPLEVEL_BINDING.eval('self').extend ExecuteSql::ConsoleMethods
.
In case you have wondered, what this top-level constant TOPLEVEL_BINDING is all about better to check sample of usage below:
a = 42
p binding.local_variable_defined?(:a) # => true
p TOPLEVEL_BINDING.local_variable_defined?(:a) # => true
def example_method
p binding.local_variable_defined?(:a) # => false
p TOPLEVEL_BINDING.local_variable_defined?(:a) # => true
end
example_method
More details about TOPLEVEL_BINDING
you can find here.
[11] pry(main)> TOPLEVEL_BINDING.eval('self')
=> main
[12] pry(main)> TOPLEVEL_BINDING
=> #<Binding:0x0000000001350b00>
As you can see TOPLEVEL_BINDING.eval('self') is basically the context of our console app.
So the last thing for us to do is to extend the main
app with our class methods from ExecuteSql::ConsoleMethods
module, source code is here.
This module inside is responsible for queries DB, and basically I took most of the code from my other gem rails_db and printing results using terminal-table gem.
Now my life is easier :)
And I hope you can implement your own utility methods.
Posted on February 19, 2020
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 29, 2024