Forum: Ruby Lafcadio 0.9.3: PostgreSQL support, eager loading, more

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Bbd147034f04bc4f8f3c3652cd2a2194?d=identicon&s=25 Francis Hwang (Guest)
on 2006-03-22 06:13
(Received via mailing list)
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.

http://lafcadio.rubyforge.org/

== What's Lafcadio? ==

Lafcadio is an object-relational mapping library for use with MySQL. It
supports a lot of advanced features, including extensive aid in mapping
to legacy databases, in-Ruby triggers, and an advanced query engine
that allows you to form queries in Ruby that can be run either against
the live database, or an in-memory mock store for testing purposes.

I use it in production code on a regular basis, most notably at
Rhizome.org, an online community with more than 1 million pageviews a
month.

== What's new? ==

= PostgreSQL support =

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.

= Eager loading =

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

= MockObjectStore handles transactions =

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.
This topic is locked and can not be replied to.