public
Rubygem
Description: Generated scopes for ActiveRecord classes
Clone URL: git://github.com/thoughtbot/pacecar.git
name age message
file .gitignore Sun Oct 05 20:19:51 -0700 2008 dont add doc dir [mjankowski]
file MIT-LICENSE Tue Oct 07 12:30:54 -0700 2008 add the MIT LICENSE [mjankowski]
file README.rdoc Wed Oct 08 12:46:25 -0700 2008 dont create null not null checks for boolean co... [mjankowski]
file Rakefile Sun Oct 05 20:01:50 -0700 2008 add first pass at boolean and datetime columns ... [mjankowski]
file init.rb Sun Oct 05 20:01:50 -0700 2008 add first pass at boolean and datetime columns ... [mjankowski]
directory lib/ Thu Oct 23 09:31:29 -0700 2008 dont protect [mjankowski]
file pacecar.gemspec Thu Oct 23 09:31:52 -0700 2008 bump the gemspec [mjankowski]
directory test/ Thu Oct 23 08:13:54 -0700 2008 use parens around respond_to? to avoid warning ... [mjankowski]
README.rdoc

Pacecar

Pacecar adds named_scope methods to ActiveRecord classes via database column introspection.

Usage

Assuming a database schema…

  class CreateSchema < ActiveRecord::Migration
    def self.up
      create_table :users, :force => true do |t|
        t.boolean :admin, :default => false, :null => false
        t.datetime :approved_at
        t.datetime :rejected_at
        t.string :first_name
        t.string :last_name
        t.text :description
        t.timestamps
      end
      create_table :posts, :force => true do |t|
        t.string :owner_type
        t.integer :owner_id
        t.string :publication_state
        t.string :post_type
        t.timestamps
      end
      create_table :comments, :force => true do |t|
        t.integer :user_id
        t.text :description
        t.timestamps
      end
    end
  end

And some basic model declarations…

  class User < ActiveRecord::Base
    has_many :posts, :as => :owner
    has_many :comments
    scopes_ranking :comments
  end

  class Post < ActiveRecord::Base
    PUBLICATION_STATES = %w(Draft Submitted Rejected Accepted)
    TYPES = %w(Free Open Private Anonymous PostModern)
    belongs_to :owner, :polymorphic => true
    scopes_state :publication_state
    scopes_state :post_type, :with => TYPES
    scopes_polymorph :owner
  end

  class Comment < ActiveRecord::Base
    belongs_to :user
  end

All columns

Records where approved_at is not null, or where it is null…

  User.approved_at_present
  User.approved_at_missing

Records where first_name is not null, or where it is null…

  User.first_name_present
  User.first_name_missing

Records ordered by first_name (default to ‘asc’, can specify to override)…

  User.by_first_name
  User.by_first_name(:asc)
  User.by_first_name(:desc)

Records where an attribute matches a search term (column LIKE "%term%")…

  User.first_name_matches('John')

Records where an attribute starts or ends with a search term…

  User.first_name_starts_with('A')
  User.first_name_ends_with('a')

Records where any non-state text or string column matches term…

  User.search_for('test')

Records where any of a list of columns match the term…

  User.search_for 'test', :on => [:first_name, :last_name]

Records where all of a list of columns match the term…

  User.search_for 'test', :on => [:first_name, :last_name], :require => :all

Boolean columns

Records that are all admins or non-admins…

  User.admin
  User.not_admin

Datetime columns

Records approved before or after certain times…

  User.approved_at_before(5.days.ago)
  User.approved_at_after(4.weeks.ago)

Records with approved_at in the past or future…

  User.approved_at_in_past
  User.approved_at_in_future

Records with approved_at inside or outside of two times…

  User.approved_at_inside(10.days.ago, 1.day.ago)
  User.approved_at_outside(2.days.ago, 1.day.ago)

Records with certain year, month or day…

  User.approved_at_in_year(2000)
  User.approved_at_in_month(01)
  User.approved_at_in_day(01)

Records with a duration (time delta between two columns) of, over or under a certain number of days…

  User.with_duration_of(14, :approved_at, :rejected_at)
  User.with_duration_over(14, :approved_at, :rejected_at)
  User.with_duration_under(14, :approved_at, :rejected_at)

Polymorphic relationships

Records which have an owner_type of User…

  Post.for_owner_type(User)

Associations

Records with the most and least associated records…

  User.maximum_comments
  User.minimum_comments

State columns

Records which are in a particular state, or not in a state…

  Post.publication_state_draft
  Post.post_type_not_open

Limits

First x records…

  User.limited(10)

Named scopes

Because these are all named_scope, you can combine them.

To get all users that have a first_name set, who are admins and approved more than 2 weeks ago, ordered by their first name…

  User.first_name_present.admin.approved_at_before(2.weeks.ago).by_first_name

To get the top 10 commenters…

  User.maximim_comments.limited(10)

License

Pacecar is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.