Skip to content

Instantly share code, notes, and snippets.

View pechorin's full-sized avatar
🌴
(do (code) (love life))

andrey pechorin pechorin

🌴
(do (code) (love life))
View GitHub Profile
@jhowarth
jhowarth / sessions_controller.rb
Created April 27, 2011 22:52
A session controller for Devise that allows ajax logins.
class SessionsController < Devise::SessionsController
def create
resource = warden.authenticate!(:scope => resource_name, :recall => :failure)
return sign_in_and_redirect(resource_name, resource)
end
def sign_in_and_redirect(resource_or_scope, resource=nil)
scope = Devise::Mapping.find_scope!(resource_or_scope)
resource ||= resource_or_scope
@scottlowe
scottlowe / article.rb
Created April 27, 2011 21:00
Model code for Postgres full text search example
class Article < ActiveRecord::Base
validates :title, :body, :presence => true
# Note that ActiveRecord ARel from() doesn't appear to accommodate "?"
# param placeholder, hence the need for manual parameter sanitization
def self.tsearch_query(search_terms, limit = query_limit)
words = sanitize(search_terms.scan(/\w+/) * "|")
Article.from("articles, to_tsquery('pg_catalog.english', #{words}) as q").
where("tsv @@ q").order("ts_rank_cd(tsv, q) DESC").limit(limit)
@hgmnz
hgmnz / query_planner.markdown
Created March 23, 2011 14:14
PostgreSQL query plan and SQL performance notes

Types of index scans

Indexes

Sequential Scan:

  • Read every row in the table
  • No reading of index. Reading from indexes is also expensive.
-- Order by one indexed column (FAST)
newsdesk_production=# explain analyze select * from pressreleases order by published_at DESC limit 100;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.00..249.91 rows=100 width=1207) (actual time=26.070..716.453 rows=100 loops=1)
-> Index Scan Backward using pressreleases_published_at_index on pressreleases (cost=0.00..964766.62 rows=386042 width=1207) (actual time=26.067..716.343 rows=100 loops=1)
Total runtime: 716.709 ms
(3 rows)
- Order by two separately indexed columns (SLOW)