Account.transaction(david, mary) do
david.withdrawal(100)
mary.deposit(100)
endclass Account < ActiveRecord::Base
validates_presence_of :subdomain, :name, :email_address, :password
validates_uniqueness_of :subdomain
validates_acceptance_of :terms_of_service, :on => :create
validates_confirmation_of :password, :email_addressm, :on => :create
endclass Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager, :class_name => "Person"
has_many :milestones, :dependent => true
has_and_belongs_to_many :categories, :join_table => "categorizations"
endclass Account < ActiveRecord::Base
has_many :people do
def find_or_create_by_name(name)
first_name, *last_name = name.split
last_name = last_name.join " "
find_or_create_by_first_name_and_last_name(first_name, last_name)
end
end
end
person = Account.find(:first).people.find_or_create_by_name("Richard Feynman")
person.first_name # => "Richard"
person.last_name # => "Feynman"class Post < ActiveRecord::Base
belongs_to :weblog
has_many :comments
has_one :author, :class => "Person"
end
class Comment < ActiveRecord::Base
def sel.search(query)
find(:all, :conditions => [ "body = ?", query ])
end
end
# SELECT * FROM comments WHERE post_id=1 AND body='hi';
Post.find(1).comments.search "hi"class Story < ActiveRecord::Base
belongs_to :iteration
acts_as_list :scope => :iteration
end
story.move_higher
story.move_to_bottomFIXME:
class Author < ActiveRecord::Base
has_many :authorships
has_many :books, :through => :authorships
end
class Book < ActiveRecord::Base
has_many :authorships
has_many :authors, :through => :authorships
end
class Authorship < ActiveRecord::Base
belongs_to :author
belongs_to :book
end
david, awrd = Author.find(1), Book.find(1)
david.authorships.create(
:book => awrd, :contribution => "partial", :written_in => "Denmark"
)
david.authorships.first.written_in # => "Denamrk"
david.books.first # => awrdFIXME:
class Person < ActiveRecord::Base
has_many :taggings, :as => :taggable, :dependent => true
has_many :tags, :through => :taggings
end
class Message < ActiveRecord::Base
has_many :taggings, :as => :taggable, :dependent => true
has_many :tags, :through => :taggings
end
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :taggable, :polymorfic => true
end
class Tag < ActiveRecord::Base
has_many :taggings
def on(*taggables)
taggables.each {|taggable| taggings.create :taggable => taggable }
end
def tagged
taggings.collect {|tagging| tagging.taggable }
end
end
david = Person.find(1)
welcome = Message.find(1)
summer = Tag.find_or_create_by_name "Summer"
summer.on(david, welcome)
david.tags # => [ summer ]
welcome.tags # => [ summer ]
summer.tagged # => [ david, welcome ]class Person < ActiveRecord::Base
acts_as_tagable
end
class Message < ActiveRecord::Base
acts_as_tagable
endFIXME:
class StoryController < ApplicationController
session :off, :only => :feed
verify :method => :post, :only => [ :coment ]
before_filter :authenticate, :only => [ :new, :edit ]
def show
@story = Story.find(params[:id])
end
def new
if request.story?
@story = Story.create(params[:story])
cookies[:last_story] = {
:value => @story.create_at,
:expires => 20.years.from_now
}
flash[:notice] = "Created new story"
redirect_to :action => "show", :id => @story
else
@story = Story.new
render :layout => "creation"
end
end
end<h1>Create a new iteration</h1>
<p>
You already have <%= pluralize(@iterations.size, "iteration") %>.
The last one started like this:
"<%= truncate(@iterations.first.description, 10) %>"
</p>
<% form_for :iteration, Iteration.new do |i| %>
Title:<br/>
<%= i.text_field :title %>
Description:<br/>
<%= i.text_area :title, :size => "20x40" %>
Completion target:<br/>
<%= i.date_select :completed_on, :discard_year => true %>
<% fields_for :story, Story.new do |s| %>
Headline:<br/>
<%= s.text_field :headline, :length => 30, :class => "big" %>
Difficulty:<br/>
<% s.select :difficulty, %w(easy medium hard) %>
<% end %>
<% end %>
...or <%= link_to "Cancel", :action => "overvire" %>xml.instruct!
xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
xml.channel do
xml.title "Backpack"
xml.link(url_for(:action => "start", :only_path => false))
xml.description "Tracking changes for your Backpack pages"
xml.language "en-us"
xml.ttl "40"
for event in @events
xml.item do
xml.title(event.headline)
xml.description(event.description)
xml.pubDate(event.created_at.to_s(:rfc822))
xml.guid(event.id)
xml.link(page_url(:id => event.page))
end
end
end
endRails::Initializer.run do |config|
config.frameworks -= [ :action_web_service ]
config.load_paths += [ "#{RAILS_ROOT}/app/services" ]
config.log_level = :debug
config.action_controller.session_store = :active_record_store
config.action_controller.fragment_cache_store = :file_store
config.active_record.default_timezone = :utc
config.active_record.schema_format = :ruby
endActionController::Routing::Routes.draw do |map|
map.start '', :controller => 'pages', :action => 'start'
map.signup 'signup', :controller => 'account', :action => 'new'
map.page 'page/:id', :controller => 'pages', :action => 'show'
map.connect 'page/:id/:action', :controller => 'pages'
map.connect 'images/icons/:icon_file', :controller => "assets", :action => "missing_icon"
map.feed 'feed/:token', :controller => "account", :action => "feed"
map.ical 'ical/:token', ::controller => "reminders", :action => "ical"
endset :application, "backpack" set :repository, "svn+ssh://somewhere/nice" set :gateway, "gateway.37signals.com" role :app, "app1.37signals.com", :primary => true role :app, "app2.37signals.com" role :app, "app3.37signals.com" role :web, "web1.37signals.com", :primary => true role :web, "web2.37signals.com" role :web, "db.37signals.com", :primary => true
