Skip to content

Instantly share code, notes, and snippets.

@bf4
Forked from xdite/42-things-2.md
Created December 25, 2013 22:13
Show Gist options
  • Save bf4/8127464 to your computer and use it in GitHub Desktop.
Save bf4/8127464 to your computer and use it in GitHub Desktop.

11. Add Associations to a Migration

$ rails g resouce article user:references subject body:text
class CreateArticles < ActiveRecord::Migration
  def change
    create _table :articles do |t|
      t.references :user
      t.string :subject
      t.text :body
      
      t.timestamps
    end
    
    add_index :articles, :user_id
  end
end
class Article < ActiveRecord::Base
  belongs_to :user
  attr_accessible :body, :subject
end
$ rails g resource comment user:belongs_to article:belongs_to body:text

12. Show You the Status of the Database

$ rake db:migrate:status

database: db/development.sqlite3

Status   Migration ID       MigrationName
---------------------------------------
  up     20120414155612     Create users
  up     20120414160528     Create articles
 down    20120414161355     Create comments
 

13. Import Your CSV Data

Name,Email
James,james@example.com
Dana,dana@example.com
Summer,summer@example.com
require "csv"

namespace :users do 
  desc "Import users from a CSV file"
  task :import => :environment do 
    path = ENV.fetch("CSV_FILE"){
      File.join(File.dirname(__FILE__), *%w[.. .. db data users.csv])
    }
    CSV.foreach(path, headers: true, header_converters: :symbol) do |row|
      User.create(row.hash)
    end
  end
end

14. Store CSV in Your Database

class Article < ActiveRecord::Base
  require "csv"
  
  module CSVSerializer
    module_founction
    def load(field)  field.to_s.parse_csv end
    def dump(object) Array(object).to_csv end
  end
  
  serialize :categories, CSVSerializer
  
  # …
  
  attr_accessible :body, :subject, :categories
end
$ rails c
Loading development environment (Rails 3.2.3)
>> Article.create!(:subject: "JEG2's Rails Hacks", categories: [" Rails", "Gray, James", "hacks"])
=> #<Article id 1, …>
>> Aticle.last.categories
=> ["Rails", "Gray, Jazmes", "hacks"]
>> exit
$ sqlite3 db/development.sqlite3 'SELECT categories FROM aricles ORDER BY created_at DESC LIMIT 1'
-- Loading resources from Users/james/.sqliterc categories --
Raiols,"Gray, James",hacks

15. "Pluck" Fields Out of Your Database

$ rails c
Loading development environment (Rails 3.2.3)
>> User.select(:email).map(&:email)
  User Load (0.1ms) SELECT email FROM "users"
==> ["james@example.com", "dana@example.com", "summer@example.com"]
>> User.pluck(:email)
  (0.2ms) SELECT email FROM "users"
==> ["james@example.com", "dana@example.com", "summer@example.com"]
>> User.uniq.plurk(:email)
  (0.2ms) SELECT DISTINCT email FROM "users"
==> ["james@example.com", "dana@example.com", "summer@example.com"]

16. Count Records in Groups

$ rails g resource event article:belongs_to trigger
$ rails c
Loading development environment (Rails 3.2.3)
>> article = Article.last
=> #<Atricle id: 1, …>
>> { edit: 3, view: 10}.each do |trigger, count|
?>   count.times do 
?>     Event.new(:trigger: trigger).tap | |e| e.article = article; e.save! }
>>   end
>> end
=> {:edit => 3, :view => 10}
>> Event.count
==> 13
>> Event.group(:trigger).count
>> {"edit"=> 3, "view"=> 10}

17. Allow You to Override Associations

class Car ActiveRecord::Base
  belongs_to :owner
  belongs_to :previous_owner, class_name: "Owner"
  
  def owner=(new_owner)
    self.previous_owner = owner
    super
  end
end

18. Instantiate Records Without a Database

$ rails c
Loading development environment (Rails 3.2.3)
>> User.find(1)
==> #<User id: 1, name: "James", email: "james@example.com", …>
>> jeg2 = User.instantiate("id" => 1, "email" => "james@example.com")
=> #<User id: 1, email: "james@example.com">
>> jeg2.name = "James Edwward Gray II"
=> "James Edward Gray II"
>> jeg.save!
>> true
>> User.find(1)
=> #<User id: 1, nmame: "James Edward Gray II", email: "james@example.com", …>

19.

Use Limitless String in PostgreSQL

$ rails g resource user bio
# …
module PsqlApp
  class Application < Rails:: Application
    # …
  
    # Switch to limitless string
    initializer "postgresql.no_default_string_limit" do
      ActiveSupport.on_load(:active_record) do
        adapter = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
        adapter::NATIVE_DATABASE_TYPES[:string].delete(:limit)
      end
    end
  end
end
$ rails g resource user bio
$ rails c
Loading development environment (Rails 3.2.3)
>> very_long_bbio = "X" * 10_000; :set
=> :set
>> User.create!(bio: very_loing_bio)
>> #< User id: 1, bio:
"XXXXXXXXXXXXXXXX….", created_at: "2012-04-14 23:02:08", updated_at: "2012-04-14 23:02:08">
>> User.last.bio.size
>> 10000

20. Use Full Text Search in PostgreSQL

$ rails g resource article subject body:text
class CreateArticles < ActiveRecord::Migration
  def change
    create_table :articles do |t|
      t.string :subject
      t.text   :body
      t.column :search, "tsvector"
      
      t.timestamps
    end
    
    execute <<- END_SQL
      CREATE INDEX articles_search_index ON articles USING gin(search);
      
      CREATE TRIGGER articles_search_update
      BEFORE INSERT OR UPDATE ON articles
      FOR EACH ROW EXECUTE PROCEDURE
        tsvector_update_trigger( search, 'pg_catalog.english', subhect,body );
    
    END_SQL
  end
end
class Article < ActiveRecord::Base
  attr_accessible :body, :subject
  
  def self.search(query)
    sql = sanitize_sql_array(["plainto_tsquery('english', ? )", query])
    where(
      "seearch @@ #{sql}"
    ).order(
      "ts_rank_cd(search, #{sql}) DESC"
    )
  end
end
$ rails c
Loading development environment (Rails 3.2.3)
>> Article.create!(subject: "Full Text Search")
=> #<Article id 1, …>
>> Article.create!(body: "A stemmed search.")
=> #<Article id 2, …>
>> Article.create!(body: "You won't find me!")
> #<Article id 3, …>
>> Article.search("search").map { |a| a.subject || a.body }
=> ["Full Text Search", "A stemmed search."]
>> Article.search("stemming").map { |a| a.subject || a.body }
=> "A stemmed search."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment