Skip to content

Instantly share code, notes, and snippets.

View rondy's full-sized avatar

Rondy Sousa rondy

  • Plataformatec
  • São Paulo, SP
View GitHub Profile
@rondy
rondy / gist:1233857
Created September 22, 2011 02:04
Authorization (modular abilities)
class User < ActiveRecord::Base
def admin?
role? :admin
end
def role?(role)
roles.include? role
end
@rondy
rondy / gist:1287061
Created October 14, 2011 13:16
Dynamic scopes injection
module BookScopes
def self.extended(base)
base.instance_exec &scope_definitions
end
def self.included(base)
base.class_exec &scope_definitions
end
@rondy
rondy / 1_books_controller.rb
Created October 18, 2011 01:47
Scoped filters
class BooksController < ApplicationController
def index
# params = { filters: { genre: "Westerns", sold_out: 1 } }
@books = Book.filtered(params[:filters])
end
end
module ActsAsClassMethod
unless respond_to? :metaclass
define_method :metaclass do
class << self; self; end
end
end
def acts_as_class_method(*methods)
methods.each do |method|
module HasStatuses
def has_statuses(*statuses)
self.const_set "Statuses", Module.new
statuses.each { |status| self::Statuses.const_set status.to_s.upcase, status }
self.const_set "ALL_STATUSES", self::Statuses.constants.collect { |constant| self::Statuses.const_get(constant) }
end
Object.send :extend, self
module WhereOr
def where_or(*scopes)
conditions = scopes.inject(self) { |scoped, scope| scoped.send(scope) }
conditions = conditions.where_values.map { |where_value| where_value.respond_to?(:to_sql) ? where_value.to_sql : where_value }
conditions = conditions.join(" OR ")
where(conditions)
end
ActiveRecord::Base.send :extend, self
require "active_support/inflector"
module Modularizable
def modularize(target, params={})
ancestors = params[:in] || []
ancestors << target
ancestors.collect { |item| item.to_s.camelize }.join("::").constantize
end
@rondy
rondy / paginator.rb
Created October 26, 2011 21:08
Paginator for Enumerable
class Paginator
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 5
attr_reader :page
attr_reader :per_page
def paginate(collection, options={})
setup(options)
Article.all(
:select => "articles.id, articles.title, slugs.name",
:joins => "INNER JOIN slugs
ON slugs.sluggable_type = 'Article' AND
slugs.sluggable_id = articles.id AND
slugs.id = (SELECT id
FROM slugs
WHERE slugs.sluggable_type = 'Article' AND
slugs.sluggable_id = articles.id
ORDER BY slugs.created_at DESC
@rondy
rondy / gist:2256526
Created March 30, 2012 22:32
Prompt branch name to deploy on Capistrano (OOP way)
namespace :deploy do
task :set_branch do
set :branch, prompt_branch_name
end
before "deploy:update" , "deploy:set_branch"
end
def prompt_branch_name
BranchedDeploy.new.prompt
end