RailsOnPg released
Hello fellow PostgreSQL and Ruby on Rails geeks,
Alexander Tretyakov (twitter) recently released a plugin for Ruby on Rails, which extends migrations and provides you with the ability to create.
While you can already do something like this with execute
in your migrations:
execute("CREATE VIEW my_tasty_snacks AS SELECT * FROM snacks WHERE food = 'Tasty';")
With RailsOnPage, you’re provided a DSL so that you can do the following:
create_view :my_tasy_snacks do |view|
view.select '*'
view.from 'snacks'
view.conditions 'food' => 'Tasty'
end
note: I haven’t tested the above, just a hypothetical example
Anyhow, if you’re in the habit of using views, functions, or triggers with your PostgreSQL database and are using Ruby on Rails, you might give RailsOnPg a whirl.
Flash Message Conductor now a Gem
We’ve been doing some early (or late… if you’re a half-full kind of person) spring cleaning on some of our projects. One of the small projects, flash_message_conductor, which we released last year as a plugin is now a gem. We’ve been moving away from using plugins in favor of gems as we like locking in specific released versions and being able to specify them in our environment.rb
file is quite convenient.
To install, just run the following:
sudo gem install flash-message-conductor --source=http://gemcutter.org
Successfully installed flash-message-conductor-1.0.0
1 gem installed
Installing ri documentation for flash-message-conductor-1.0.0...
Installing RDoc documentation for flash-message-conductor-1.0.0...
You’ll then just need to include the following in your config/environment.rb
file.
Rails::Initializer.run do |config|
# ...
config.gem 'flash-message-conductor', :lib => 'flash_message_conductor', :source => "http://gemcutter.org"
end
You can take a peak at the README for usage examples.
We’ll be packaging up a handful of our various plugins that we reuse on projects and moving them to gems. Stay tuned… :-)
Question: Plugins or Gems? (or both?)
1 comment Latest by Alex Stoneham Tue, 02 Feb 2010 17:20:27 GMT
Our development team likes to extract reusable pieces of code for our projects and have historically used plugins. However, we are finding more and more people releasing these sorts of modules/components/patterns as gems.
Which do you prefer and why?
If you use both, how do you decide to use plugins or gems?
DRY(a): Year After Year
I’m guilty of it. Many of you are likely guilty of it… and I know that several customers of our Rails Code Audit and Review service are guilty of it.
How many times have you realized (after a few months has passed) that your Copyright date/year on your web site was no longer current?
How many of you had the same problem last year? The year before?
Let me share some advice with you all… DRY (a)!
Don’t Repeat Yourself (again)!
This is really a simple problem to fix but when we’re busy tackling bigger problems… little things like this slip by. Don’t worry, you’re not the only one who was reminded by a colleague three months into the year that you forgot to update this.
On client projects, we have a handful of helpers that we drop into the application. We’re starting to extract more of these into plugins and will be releasing those as time permits. It just happened that I found myself looking at yet-another Rails code base this afternoon that was showing 2007 in the footer. An easily forgivable offense.. but if you’re going to go in there and change it (again), take a moment to do the right thing. ;-)
Our solution at Planet Argon on client projects is to create a basic view helper that renders the current year. This allows us to do the following.
<div id="footer">
© Copyright <%= current_year -%>. All Rights Reserved.
</div>
The helper code looks like:
# add to application_helper.rb
module ApplicationHelper
def current_year
Time.now.strftime('%Y')
end
end
Voila. Not rocket science.. is it?
Guess what? I’m getting really tired of adding this to every Rails project that I touch. So, I bottled this little gem into a new Rails plugin that we’ll just add to future projects.
Introducing Year after Year
This is really the smallest plugin that I could put together (and it includes specs!)
What does it provide you?
YearAfterYear will provide you a helper that will render the current year (dynamically)! That’s right… just add the plugin to your Rails application and you too can enjoy New Years 2009 without having to have a deployment ready with a one line change from 2008 to 2009!
To use.. add the following to any view from within Ruby on Rails.
<%= current_year -%>
Installation
As I’m using git, you’ll need to grab this and put it into vendor/plugins
. That’s it!
You can grab it on GitHub!
- http://github.com/robbyrussell/year_after_year/
- Bugs / Feature Requests here
Happy New Years (8+ months early)!
Just a friendly reminder to not forget the small stuff… because your visitors will notice! ;-)
Updates…
I got a few requests for this to also provide a range of years for people who like to do: 2005-2007. So this is now provided as well.
year_range(start_year)
<%= year_range(2005) %> # => 2005-2008
Master/Slave Databases with Ruby on Rails
Not terribly long ago, I announced Active Delegate, which was a really lightweight plugin that I developed to allow models to talk to multiple databases for specific methods. The plugin worked great for really simple situations, like individual models.. but when it came time to test with associations it fell apart. I haven’t had a chance to work on any updates and knew that it was going to take more work to get it going.
Earlier this week, we helped one of our bigger clients launch their new web site1. For the deployment, we needed to send all writes to a master database and a reads to slaves (initial deployment is talking to almost 10 slaves spread around the globe!). We needed something to get integrated quickly and decided to ditch Active Delegate for the time being and began looking at the following options.
I spoke with Rick Olson2 and he pointed me to a new plugin that he hasn’t really released yet. So, I’m going to do him a favor and announce it for him. Of course… I got his permission first… ;-)
Announcing Masochism!
Masochism3 is a new plugin for Ruby on Rails that allows you to delegate all writes to a master database and reads to a slave database. The configuration process is just a few lines in your environment file and the plugin takes care of the rest.
Installing Masochism
With piston, you can import Masochism with:
$ cd vendor/plugins
$ piston import http://ar-code.svn.engineyard.com/plugins/masochism/
- To learn more about piston, read Every Second Counts with a Piston in your trunk
You can also install it with the old-fashioned way:
$ ./script/plugin install -x http://ar-code.svn.engineyard.com/plugins/masochism/
Configuring Masochism
The first thing that you’ll need to do is add another database connection in config/database.yml
for master_database
. By default, Masochism expects you to have a production database, which will be the read-only/slave database. The master_database
will be the connection details for your (you guessed it…) master database.
# config/database.yml
production:
database: masochism_slave_database
adapter: postgresql
host: slavedb1.hostname.tld
...
master_database:
database: masochism_master_database
adapter: postgresql
host: masterdb.hostname.tld
...
The idea here is that replication will be handled elsewhere and your application can reap the benefits of talking to the slave database for all of it’s read-only operations and let the master database(s) spend their time writing data.
The next step is to set this up in your environment file. In our scenario, this was config/environments/production.rb
.
# Add this to config/environments/production.rb
config.after_initialize do
ActiveReload::ConnectionProxy.setup!
end
Voila, you should be good to go now. As I mentioned, we’ve only been using this for this past week and we’ve had to address a few problems that the initial version of the plugin didn’t address. One of our developers, Andy Delcambre, just posted an article to show how we had a problem with using ActiveRecord observers and masochism, which we’re sending over a patch for now.
As we continue to monitor how this solution works, we’ll report any findings on our blog. In the meantime, I’d be interested in knowing what you’re using to solve this problem. :-)
1 Contiki, a cool travel company we’re working with
2 Rick just moved to Portland… welcome to stump town!
Multiple Database Connections in Ruby on Rails
We have a client that already has some database replication going on in their deployment and needed to have most of their Ruby on Rails application pull from slave servers, but the few writes would go to the master, which would then end up in their slaves.
So, I was able to quickly extend ActiveRecord with just two methods to achieve this. Anyhow, earlier today, someone in #caboose asked if there was any solutions to this and it prompted me to finally package this up into a quick and dirty Rails plugin.
Introducing… Active Delegate!
To install, do the following:
cd vendor/plugins;
piston import http://svn.planetargon.org/rails/plugins/active_delegate
Next, you’ll need to create another database entry in your database.yml
.
login: &login
adapter: postgresql
host: localhost
port: 5432
development:
database: rubyurl_development
<<: *login
test:
database: rubyurl_test
<<: *login
production:
database: rubyurl_servant
<<: *login
# NOTICE THE NEXT ENTRY/KEY
master_database:
database: rubyurl_master
<<: *login
At this point, your Rails application won’t talk to the master_database
, because nothing is being told to connect to it. So, the current solution with Active Delegate is to create an ActiveRecord model that will act as a connection handler.
# app/models/master_database.rb
class MasterDatabase < ActiveRecord::Base
handles_connection_for :master_database # <-- this matches the key from our database.yml
end
Now, in the model(s) that we’ll want to have talk to this database, we’ll do add the following.
# app/models/animal.rb
class Animal < ActiveRecord::Base
delegates_connection_to :master_database, :on => [:create, :save, :destroy]
end
Now, when your application performs a create
, save
, or destroy
, it’ll talk to the master database and your find
calls will retrieve data from your servant database.
It’s late on a Friday afternoon and I felt compelled to toss this up for everyone. I think that this could be improved quite a bit, but it’s working great for the original problem that needed to be solved.
If you have feedback and/or bugs, please send us tickets.
Older posts: 1 2