Rails 2.1.0 – named_scope

New version of rails comes with a great feature called named_scope.

# in your model.rb

class Model < ActiveRecord::Base
 has_many ...
 belongs_to ...

 named_scope :active, :conditions => {:state => 'active'}
 named_scope :today, :conditions => ['date_created between ? and ?', Time.today.to_i, Time.today.to_i+3600*24-1]
 named_scope :by_date_asc, :order => 'date_created asc'
 named_scope :by_date_desc, :order => 'date_created desc'
 named_scope :user_name, lambda {|name| {:conditions => {:username => name}}

and you can use its as:

# somewhere in your code

  @data = Model.today
  @data = Model.today.active.by_date_asc
  @data = Model.user_name('some user').active.today.by_date_desc

own application configuration

./config/my_configuration.yml
MyConfig:
  username: my_username
  password: my_password
  host: my_host

be sure to enter spaces, NOT tabs

./config/environment.rb
require 'ostruct'
require 'yaml'

OwnConfigFile = "#{RAILS_ROOT}/config/my_configuration.yml"
if File.exist?(MyConfigFile)
  ::ApplicationConfig = OpenStruct.new(YAML.load_file(MyConfigFile))
end

in application:

config = ApplicationConfig.MyConfig;
puts config['username']

Exception handling

./lib/mymodule.rb

module MyModule

  class Error < RuntimeError; end
  class ConnectionError < Error; end

  def connect

    if something_failed?
      raise ConnectionError, "connection failed due to..."
    end
  end
end

somewhere in controller

include MyModule

  def do_connect
    begin
      connect
    rescue MyModule::ConnectionError => err
      flash.now[:notice] => err
    end
  end

Double buffering

This is an example, how to do and use double buffering (offscreen window) to create smooth animations

WinHandle displayWindow;
WinHandle offscreenWindow;

void CreateOffScreen() {
    Err err;
    offscreenWindow = WinCreateOffscreenWindow(160,160, screenFormat, &err);
}

void PaintOffScreen() {
    WinSetDrawWindow(offscreenWindow);
    // draw there
}

void Show() {
    RectangleType bounds;

    WinSetDrawWindow(displayWindow);
    WinGetBounds(displayWindow, &bounds);
    WinCopyRectangle (offscreenWindow, 0, &bounds, 0, 0, 0);
}