Pacecar adds scope methods and other common functionality to ActiveRecord classes via database column introspection.
Pacecar automatically includes the Pacecar::Helpers module into all ActiveRecord::Base classes.
To get all Pacecar functionality, you need to "include Pacecar" in your class.
class User < ActiveRecord::Base
include Pacecar
end
To get some subset (for example, only the state functionality), you can do something like "include Pacecar::State" to get only the module(s) you want.
class Post < ActiveRecord::Base
include Pacecar::State
end
Pacecar supports mysql, postgres and sqlite database drivers, and is compatible with Rails 4.x versions.
Just include in your Gemfile:
gem 'pacecar'
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.integer :rating
t.timestamps
end
end
end
And some basic model declarations:
class User < ActiveRecord::Base
include Pacecar
has_many :posts, as: :owner
has_many :comments
has_many :articles
end
class Post < ActiveRecord::Base
include Pacecar
PUBLICATION_STATES = %w(Draft Submitted Rejected Accepted)
TYPES = %w(Free Open Private Anonymous PostModern)
belongs_to :owner, polymorphic: true
has_state :publication_state
has_state :post_type, with: TYPES
has_polymorph :owner
end
class Comment < ActiveRecord::Base
include Pacecar
belongs_to :user
end
class Article < ActiveRecord::Base
belongs_to :user
end
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 exactly a term:
User.first_name_equals('John')
Records that are all admins or non-admins:
User.admin
User.not_admin
Records which have an owner_type of User:
Post.for_owner_type(User)
Records which are in a particular state, or not in a state:
Post.publication_state_draft
Post.post_type_not_open
Query methods on instances to check state:
Post.first.publication_state_draft?
Post.last.post_type_not_open?
First x records:
User.limited(10)
Because these are all scope, you can combine them.
To get all users that have a first_name set, who are admins:
User.first_name_present.admin
- MySQL
- SQLite
- Postgres
Pacecar is maintained and funded by thoughtbot, inc
Thank you to all the contributors!
The names and logos for thoughtbot are trademarks of thoughtbot, inc.
Pacecar is Copyright © 2008-2013 thoughtbot. It is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.