<< Ten-sided launches |
| Fictohedron: An alternate Ten-sided reader >>
Posted Tuesday, March 21, 2006 | Tagged: ruby
The newest development release of Lafcadio, 0.9.3, now supports PostgreSQL, adds eager loading, and has a few more additions.
As always, odd-numbered releases should be considered beta. If you want to play it safe, use 0.8.3 instead.
Lafcadio now supports PostgreSQL. Activating is a simple matter of setting ‘dbtype’ in LafcadioConfig:
LafcadioConfig.set_values( 'dbuser' => 'testuser', 'dbpassword' => 'password', 'dbname' => 'test_db', 'dbhost' => 'localhost', 'dbtype' => 'Pg' )
Everything else—single-row retrieval, transactions, query inference, order and limit clauses—works transparently across both MySQL and PostgreSQL.
To prevent excessive selects, you can now use eager loading to load across associations with one select statement:
all_invoices = Invoice.all( :include => :client ) # Knows Client information without incurring another select all_invoices.first.client.name
Transaction support was previously added, in 0.9.0, but I forgot to add transaction support to the MockObjectStore. Now that the MockObjectStore mimics the database, you can test transaction-dependent logic in-memory, within having a real database installed.
For example, below is a (somewhat stupid) method that uses transactions, with a test-case using the in-memory MockObjectStore:
def transfer_money( from_account, to_account, tr_amount )
object_store = Lafcadio::ObjectStore.get_object_store
object_store.transaction do |tr|
from_account.update!(
'amount' => from_account.amount - tr_amount
)
to_account.update!( 'amount' => to_account.amount + tr_amount )
tr.rollback if from_account.amount < 0
end
end
class TestTransferMoney < Test::Unit::TestCase
def test_rollback_if_less_than_zero
mock_object_store = MockObjectStore.new
ObjectStore.set_object_store mock_object_store
from_account = Account.new( 'amount' => 100.0 ).commit
to_account = Account.new( 'amount' => 0.0 ).commit
transfer_money( from_account, to_account, 200.0 )
from_account_prime = Account[from_account.pk_id]
assert_equal( 100.0, from_account_prime.amount )
end
end
Commits and rollbacks work for the test code, even if you don’t have a database installed.