Cubus Arts Blog

/ ruby on rails
Gabriel Târnovan

Simple Audit for Rails Apps

Gabriel Târnovan

simple_audit is a lightweight auditing solution for Rails apps. Instead of auditing all attributes of your models, simple_audit allows you to specify what data is relevant for auditing. This simple idea makes auditing complex model aggregations (through has_many, has_one, habtm associations) trivial.

Audit in 2 minutes:

Result will look like this:
Screenshot of helper result

Why ?

simple_audit is intended as a straightforward auditing solution for complex model associations. In a normalized data structure (which is usually the case when using SQL), a core business model will aggregate data from several associated entities. More often than not in such cases, only the core model is of interest from an auditing point of view (the parent in the has_xxx relations).

One approach would be to audit all aggregated entities sepparately. The downside of this is the high complexity of retracing all changes triggered on each save. Another minus is the increased database workload.

simple_audit takes a simpler approach: you decide for each audited model what data needs to be audited by specifying a serializable representation of all relevant information – including the any relevant aggregated entities (e.g. the housing_unit_bookings in the above example) This data will be serialized on every save. The available helper methods will render a clear audit trail (see above).

Limitations

This is not a solution for versioning. Changed data can not be restored. Use acts_as_audited or acts_as_versioned for that.

Dependencies

The current user is assumed to be available by calling User.current You can use sentient_user or roll your own solution.

More information

Read more on the github page. Contributions are welcome!

Mihai Târnovan

Installing mysql gem with Percona XtraDB

Mihai Târnovan

After installing the mysql gem, we were seeing uninitialized constant MysqlCompat::MysqlRes errors all over the place, although the gem installed fine.

This was on FreeBSD 8.1. Turns out Percona XtraDB binary doesn’t include the mysql client libs, so you need to install those as well. On FreeBSD just do

pkg_add -r mysql51-client

Then reinstall the gem:

env ARCHFLAGS="-arch x86_64" gem i mysql -- --with-mysql-config=/usr/local/percona-xtradb/bin/mysql_config

Mihai Târnovan

Ruby Eval stacktrace position information

Mihai Târnovan

We’ve been often annoyed by warnings or exceptions like this: (eval):231: some error or warning. They make it very difficult to pinpoint the exact location of the problem.

The problem is usually cause by module_eval being called without file and line information. There’s an interesting write-up about eval and position information on Ola Bini’s blog. One of his readers observed that when using module_eval like this you’ll get the incorrect line number:

However, I noticed that if you write the heredoc inline you’ll get the correct line in the backtrace:

__LINE__ + 1 accounts for the line with the module_eval itself. I tested this with Ruby 1.8.6 and Ruby 1.9.1 and it applies for both, tough 1.9 at least puts more lines in the backtrace with the position of the module_eval call.

Passing __FILE__ and __LINE__ is better than skipping them, but can lead to false line numbers unless you use the 2nd form with the inlined heredoc.