$ 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
$ rake db:migrate:status
database: db/development.sqlite3
Status Migration ID MigrationName
---------------------------------------
up 20120414155612 Create users
up 20120414160528 Create articles
down 20120414161355 Create comments
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
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
$ 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"]
$ 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}
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
$ 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", …>
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
$ 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."