成功的條件

今天在想成功的條件, 現在總結有這幾條:
成功在這裡指完成一件事.
1.堅定決心
一要很想完成這事,慾望很強; 二要對這事堅貞不逾, 事不成不罷休, 包括在遇到多大的困難和挫折時都不改志向.
2.人際關係
好人際關係可以得到很多的幫助, 使事件的發展勢勢如破竹.
3.人力物力
做事的基礎. 包括自己的技能(人力之一).
4.計謀策略
做事的方法
5.天時地利

發表在 成敗幾何 | 留下評論

舍 得

有時候舍就是得,得就是舍. 要取捨清楚.

發表在 成敗幾何 | 留下評論

如何長生不老

如何才能長生不老是我一直在研究的課題之一.
雖然我還未能找到長生的方法.但我找到了一個很重要的線索.
要做到長生不老,起碼要做到的一個就是:
不狂喜,不痛悲

情感是使人衰老,特別是悲愁. 我親眼看到過N個中年人因為一件愁心的事半年之後成為老年人. 由中年過度到老年更決定的因素不是年月,而是情感.

古書更有一夜白髮的事件無數, 我相信這是真實的.

要做到長壽,很重要的就是做到不狂喜,不痛悲.對得失都看得很淡泊.

要如何能做到這點呢?

本身的思想眼光應該是廣博的. 心懷宇宙. 對於百,一為少,對於萬,百為小,對於億,萬亦不足道. 對於年,日為短,於宇宙的長存,人之一生演的不過是百年的喜悲; 人活於浩瀚之天地,人的手腳舞動不過在尺寸之內. 之於無際的宇宙,人只是不起眼的一個小點, 算得了什麼? 這樣的一生得到什麼,又失去什麼, 一定要讓人狂喜,一定要讓人痛悲???

 每在不順心時我都會仰望天空, 看着廣闊的天空或浩瀚的星空,我的不順心有如宇宙間的一顆塵埃,微–不足道!

發表在 我思我在 | 2 條評論

Ruby on Rails頁面緩存

三種方式 Page Caching, Action Caching和 Fragment Caching

緩存默認只在production 環境下啟動

Page Caching
caches_page :public_content
以URL為準
expire_page :action =>"public_content"

Action Caching
caches_action :premium_content
以URL為準
 expire_action :action => "premium_content", :id => article
 Page Caching 和 Action Caching的實例:
class ContentController < ApplicationController
 before_filter :verify_premium_user, :except => :public_content
 caches_page :public_content
 caches_action :premium_content
 cache_sweeper :article_sweeper,
        :only => [ :create_article,
        :update_article,
        :delete_article ]
 def public_content
  @articles = Article.list_public
 end
 def premium_content
  @articles = Article.list_premium
 end
 private
 def verify_premium_user
  return
   user = session[:user_id]
   user = User.find(user)
  if user
   unless user && user.active?
   redirect_to :controller =>  "login", :action => "signup_new"
  end
 end
end

刪除過期緩存內容:
app/models中加article_sweeper.rb
class ArticleSweeper < ActionController::Caching::Sweeper
 observe Article
 def after_create(article)
  expire_public_page
 end
 def after_update(article)
  expire_article_page(article.id)
 end
 def after_destroy(article)
  expire_public_page
  expire_article_page(article.id)
 end
 private
 def expire_public_page
  expire_page(:controller => "content", :action => ‘public_content’)
 end
 def expire_article_page(article_id)
  expire_action(:controller =>  "content",
        :action => "premium_content",
        :id => article_id)
 end
end
app/public/content/show/1默認caches_page文件路徑
app/public/content/show/1.html

Fragment Caching
controller:
class Blog1Controller < ApplicationController
 def list
  @dynamic_content = Time.now.to_s
  unless read_fragment(:action => ‘list’)
   logger.info("Creating fragment")
   @articles = Article.find_recent
  end
 end
end
#read_fragment()查看一個action的fragment緩存是否存在
view:
<%= @dynamic_content %> <!– 動態內容 –>
<% cache do %> <!– 緩存開始–>
 <ul>
 <% for article in @articles -%>
  <li><p><%= h(article.body) %></p></li>
 <% end -%>
 </ul>
<% end %> <!– 結束緩存 –>
<%= @dynamic_content %> <!– 其它動態內容 –>

使用多個緩存段:
<% cache(:action => ‘list’, :part => ‘articles’) do %>
 <ul>
 <% for article in @articles -%>
  <li><p><%= h(article.body) %></p></li>
 <% end -%>
 </ul>
<% end %>
<% cache(:action => ‘list’, :part => ‘counts’) do %>
 <p>There are a total of <%= @article_count %> articles.</p>
<% end %>
#使用:part參數區分同一action下的不同緩存段

緩存過期
controller:
class Blog2Controller < ApplicationController
 def list
  @dynamic_content = Time.now.to_s
  @articles = Article.find_recent
  @article_count = @articles.size
 end
 def edit
  # 編輯文章時不更新統計緩存
  expire_fragment(:action => ‘list’, :part => ‘articles’)
  redirect_to(:action => ‘list’)
 end
 def delete
  #刪除文章時同時刪除兩個緩存
  expire_fragment(:action => ‘list’, :part => ‘articles’)
  expire_fragment(:action => ‘list’, :part => ‘counts’)
  redirect_to(:action => ‘list’)
 end
end

expire_fragment()可接正則表達式
expire_fragment(%r{/blog2/list. })

Fragment Caching存儲選項設置:
ActionController::Base.fragment_cache_store = <下面的選項之一>
ActionController::Caching::Fragments::FileStore.new(path)
ActionController::Caching::Fragments::DRbStore.new(url)
ActionController::Caching::Fragments::MemCachedStore.new(host)

發表在 Ruby on Rails | 留下評論

Ruby on Rails Action Controller學習筆記

自動增加預載model方法:
class StoreController < ApplicationController
 model :cart, :line_item
 observer :stock_control_observer
 # …

如果沒有找到相應的action, method_missing()將被調用
如果沒有任何action, Rails會直接找template顯示.

Ruby on Rails鏈接
Routing Requests
配置文件:config/routes.rb
ActionController::Routing::Routes.draw do |map|
 map.connect ‘:controller/service.wsdl’, :action => ‘wsdl’
 map.connect ‘:controller/:action/:id’
end

map.connect可用參數:
:defaults => { :name => "value", …}
 設默認值,默認為:defaults => { :action => "index", :id => nil }
:requirements => { :name =>/regexp/, …}
:name => value
:name => /regexp/

實例:
ActionController::Routing::Routes.draw do |map|
 #從上到下優先級降低.
 #’http://my.app/blog/&#39; 直接顯示 index
 map.connect "blog/",
   :controller => "blog",
   :action =>"index"
 #按日期訪問博客文章列表
 map.connect "blog/:year/:month/:day",
      :controller =>"blog",
      :action =>"show_date",
      :requirements => { :year => /(19|20)\d\d/,
               :month => /[01]?\d/,
               :day => /[0-3]?\d/},
      :day =>nil,
      :month =>nil
 # 按文章ID顯示文章內容
 map.connect "blog/show/:id",
      :controller => "blog",
      :action =>"show",
      :id => /\d+/
 # 管理頁面,常規
 map.connect "blog/:controller/:action/:id"
 # 其它
 map.connect "*anything",
      :controller =>"blog",
      :action =>"unknown_request"
 #=> URL>junk
 #=>@params = {:anything=>["junk"], :controller=>"blog", :action=>"unknown_request"}
end

鏈接生成url_for
@link = url_for :controller => "store", :action => "display", :id => 123
生成:http://pragprog.com/store/display/123
url_for(:controller => "store", :action => "list",
 :id => 123, :extra => "wibble")
生成:http://rubygarden.org/store/list/123?extra=wibble
url_for(:overwrite_params => {:year => "2002"})
生成:http://pragprog.com/blog/2002/4/15
#url_for會使用默認環境中的參數自動補充出完整的地址
#但一般補最後面的
#使用:overwrite_params使之補前面的.
url_for(:year=>year, :month=>sprintf("%02d", month), :day=>sprintf("%02d", day))
用來填充位數???
url_for(:controller => "/store", :action => "purchase", :id => 123)
#=> http://my.app/store/purchase/123
url_for(:controller => "/archive/book", :action => "record", :id => 123)
#=> http://my.app/archive/book/record/123

redirect_to(:action =>’delete’, :id => user.id)
# 和上面的一樣:
redirect_to(:action => ‘delete’, :id => user)

default_url_options()
:anchor string #+string
:host string  (helper.pragprog.com:8080)
:only_path boolean
:protocol string ("https://";)
:trailing_slash boolean (+"/"?)

有名字的 Routes
map.date "blog/:year/:month/:day",
    :controller =>"blog",
    :action =>"show_date",
    :requirements => { :year => /(19|20)\d\d/,
            :month => /[01]?\d/,
            :day => /[0-3]?\d/},
    :day =>nil,
    :month =>nil
可調用
date_url(:year => 2003, :month => 2)
#=> http://pragprog.com/blog/2003/2

方法
把action藏起來,讓它使用URL訪問不了.
hide_action :check_credit
def check_credit(order)
# …
end

Controller Environment
request
  domain()
  remote_ip()
  env() 如:request.env['HTTP_ACCEPT_LANGUAGE']
  method (:delete, :get, :head,:post, or :put.)
   delete?, get?, head?, post?, and put?
class BlogController < ApplicationController
 def add_user
  if request.get?
   @user = User.new
  else
   @user = User.new(params[:user])
   @user.created_from_ip = request.env["REMOTE_HOST"]
   if @user.save
    redirect_to_index("User #{@user.name} created")
   end
  end
 end
end

params
cookies
response
session
headers

runder()
更改默認template目錄
ActionController::Base.template_root=dir_path
render(:text=>string)
class HappyController < ApplicationController
 def index
  render(:text =>"Hello there!")
 end
end

render(:inline=>string, [ :type =>"rhtml"|"rxml"] )
class SomeController < ApplicationController
 if RAILS_ENV == "development"
  def method_missing(name, *args)
   render(:inline => %{  
    <h2>Unknown action:#{name}</h2>
    Here are the request parameters:<br/>
    <%= debug(params) %> })
  end
 end
end

render(:action =>action_name)
def display_cart
 if @cart.empty?
  render(:action => :index)
 else
  # …
 end
end

render(:file =>path, [ :use_full_path =>true|false] )

render(:template =>name)
class BlogController < ApplicationController
 def index
  render(:template =>"blog/short_list")
 end
end

render(:partial =>name, …)
render(:nothing => true)
render_to_string() 不發送,直接轉為string

發送
send_data
def sales_graph
png_data = Sales.plot_for(Date.today.month)
 send_data(png_data, :type => "image/png", :disposition => "inline")
end

send_file
def send_secret_file
 send_file("/files/secret_list")
 headers["Content-Description"] = "Top secret"
end

有些地方使用redirect_to代替render
redirect_to(:action => ‘display’)

redirect_to(options…)
redirect_to(path)
redirect_to(url)

Cookies and Sessions
Cookies只能存String
class CookiesController < ApplicationController
 def action_one
  cookies[:the_time] = Time.now.to_s
  redirect_to :action =>"action_two"
 end
 def action_two
  cookie_value = cookies[:the_time]
  render(:text => "The cookie says it is #{cookie_value}")
 end
end

cookies[:marsupial] = { :value => "wombat",
          :expires => 30.days.from_now,
          :path =>"/store" }
可用選項 :domain, :expires,:path, :secure, and :value

Sessions
保存model時要先預載:
class BlogController < ApplicationController
 model :user_preferences

設置session:
ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS[:session_key] = ‘my_app’
可用選項:
:database_manager
:session_domain
:session_id
:session_key
:session_path
:session_secure
Session保存選擇:
:database_manager => CGI::Session::PStore
  flat file (單服務器推薦)
:database_manager => CGI::Session::ActiveRecordStore
:database_manager => CGI::Session::DRbStore
:database_manager => CGI::Session::MemCacheStore

Flash用於在兩個action傳輸暫時信息
flash.now用法實例:
class BlogController
 def display
  unless flash[:note]
   flash.now[:note] = "Welcome to my blog"
  end
  @article = Article.find(params[:id])
 end
end

flash.keep用法實例:
class SillyController
 def one
  flash[:note] = "Hello"
  redirect_to :action => "two"
 end
 def two
  flash.keep(:note)
  redirect_to :action => "three"
 end
 def three
  # flash[:note] => "Hello"
 render
 end
end

Filters
class BlogController < ApplicationController
 before_filter :authorize, :only => [ :delete, :edit_comment ]
 after_filter :log_access, :except => :rss
 # …
before_filter可用來替換全局頁面中的字符,如{$title}
也可用來給頁面 Zlib壓縮
Around Filters可用來計算action用時

Verification
class BlogController < ApplicationController
 verify :only => :post_comment,
 :session => :user_id,
 :add_flash => { :note =>"You must log in to comment"},
 :redirect_to => :index
 # …
使用範圍:
:only =>:name or [ :name, ... ]
:except =>:name or [ :name, ... ]
通過條件:
:flash =>:key or [ :key,... ]
:method =>:symbol or [ :symbol, ... ](:get, :post, :head, or :delete)
:params =>:key or [ :key,... ]
:session =>:key or [ :key,... ]
反應:
:add_flash =>hash
:redirect_to =>params

 GET Requests
 GET用來獲取信息
 POST用來傳輸更改數據庫的信息
 <%= link_to ‘刪除評論’, { :action => ‘com_destroy’, :id => comment },
     :confirm =>"你確定要刪除這則評論嗎?",
     :post => true %>
使用forms和buttons

發表在 Ruby on Rails | 留下評論

更多Ruby on Rails的Active Record

Callbacks
class User < ActiveRecord::Base
 before_destroy :dont_destroy_dave
 def dont_destroy_dave
  raise "Can’t destroy dave" if name == ‘dave’
 end
end

class Order < ActiveRecord::Base
 # ..
 def before_save
  self.payment_due ||= Time.now + 30.days
 end
end

class Order < ActiveRecord::Base
 before_validation :normalize_credit_card_number
 after_create do |order|
  logger.info "Order #{order.id} created"
 end
 protected
 def normalize_credit_card_number
  self.cc_number.gsub!(/-\w/, ”)
 end
end

Callback Objects 全局可以訪問
class CreditCardCallbacks
 # Normalize the credit card number
 def before_validation(model)
  model.cc_number.gsub!(/-\w/,”)
 end
end

class Order < ActiveRecord::Base
 before_validation CreditCardCallbacks.new
 # …
end
 Subscription < ActiveRecord::Base
class
 before_validation CreditCardCallbacks.new
 # …
end
可用於數據加密

格式化數據類型:
class LineItem < ActiveRecord::Base
 def total_price
  Float(read_attribute("total_price"))
 end
end

數量單位轉換:
class ProductData < ActiveRecord::Base
 CUBITS_TO_INCHES = 18
 def length
  read_attribute("length") * CUBITS_TO_INCHES
 end
 
 def length=(inches)
  write_attribute("length", Float(inches) / CUBITS_TO_INCHES)
 end
end

find_by_sql沒有讀取PK時不能保存的實例:
result = LineItem.find_by_sql("select quantity from line_items")
result.each do |li|
 li.quantity += 2
 li.save
end

有特殊功能的段名
created_at, created_on, updated_at, updated_on
 ror自動更新的時間段
 修改ActiveRecord::Base.default_timezone = :utc參數更改變時區
lock_version
type
 (employee, manager, person..)
id
XXX_id (FK)
xxx_count
position (acts_as_list)
partent_id (acts_as_tree)

發表在 Ruby on Rails | 留下評論

Ruby on Rails 的檢驗方法(Validation Helpers)大全

可以自定義validate(), 這個方法在每次保存數據時都會被調用.
如:
def validate
 if name.blank? && email.blank?
  errors.add_to_base("You must specify a name or an email address")
 end
end
同時也可以自定義 validate_on_create(), validate_on_update()方法.
 valid?()方法可以隨時調用,用來測試數據是否能通過校驗
返回的錯誤信息可用 error_messages_for(model)方法顯示.
如:<%= error_messages_for ‘article’ %>

校驗大全:
validates_acceptance_of
 指定checkbox應該選中. (如:(*)我同意條款)
 用法:validates_acceptance_of attr… [ options... ]
 參數:message text  默認:“must be accepted.”
   :on :save, :create, or :update
 實例:
 class Order < ActiveRecord::Base
  validates_acceptance_of :terms,
              :message => "Please accept the terms to proceed"
 end

validates_associated
 查驗指定的object.
 用法:validates_associated name… [ options... ]
 參數:message text 默認: is “is invalid.”
   :on :save, :create, or :update
 實例:
 class Order < ActiveRecord::Base
  has_many :line_items
  belongs_to :user
  validates_associated :line_items,
            :message => "are messed up"
  validates_associated :user
 end

validates_confirmation_of
 數據重校
 用法:validates_confirmation_of attr… [ options... ]
 參數:message text 默認 “doesn’t match confirmation.”
   :on :save, :create, or :update
 實例:
 對密碼錶:
 <%= password_field "user", "password" %><br />
 <%= password_field "user", "password_confirmation" %><br />
 #第二表名為xxxx_confirmation
 class User < ActiveRecord::Base
  validates_confirmation_of :password
 end

validates_each
 使用block檢驗一個或一個以上參數.
 用法:validates_each attr… [ options... ] { |model, attr, value| … }
 參數:allow_nil boolean 設為true時跳過nil對象.
   :on :save, :create, or :update
 實例:
 class User < ActiveRecord::Base
  validates_each :name, :email do |model, attr, value|
   if value =~ /groucho|harpo|chico/i
    model.errors.add(attr,"You can’t be serious, #{value}")
   end
  end
 end

validates_exclusion_of
 確定被檢對象不包括指定數據
 用法:validates_exclusion_of attr…, :in => enum [ options... ]
 #enum指一切可用include?()判斷的範圍.
 參數:allow_nil 設為true將直接跳過nil對象.
   :in (or :within) enumerable
   :message text 默認為: “is not included in the list.”
   :on :save, :create, or :update
 實例:
 class User < ActiveRecord::Base
  validates_exclusion_of :genre,
            :in => %w{ polka twostep foxtrot },
            :message =>"no wild music allowed"
  validates_exclusion_of :age,
             :in => 13..19,
             :message =>"cannot be a teenager"
 end

validates_inclusion_of
 確認對象包括在指定範圍
 用法:validates_inclusion_of attr…, :in => enum [ options... ]
 參數:allow_nil 設為true直接跳過nil對象
   :in (or :within) enumerable An enumerable object.
   :message text 默認:“is not included in the list.”
   :on :save, :create, or :update
 實例:
 class User < ActiveRecord::Base
  validates_inclusion_of :gender,
            :in => %w{ male female },
            :message =>"should be ‘male’ or ‘female’"
  validates_inclusion_of :age,
            :in => 0..130,
            :message =>"should be between 0 and 130"
 end

validates_format_of
 用正則檢驗對象
 用法:validates_format_of attr…, :with => regexp [ options... ]
 參數:message text 默認為: “is invalid.”
   :on :save, :create, or :update
   :with 正則表達式
 實例:
 class User < ActiveRecord::Base
  validates_format_of :length, :with => /^\d+(in|cm)/
 end

validates_length_of
 檢查對象長度
 用法:validates_length_of attr…, [ options... ]
 參數:in (or :within) range
   :is integer
   :minimum integer
   :maximum integer
   :message text 默認文字會根據參數變動,可使用%d 取代確定的最大,最小或指定數據.
   :on :save, :create, or :update
   :too_long text 當使用了 :maximum後的 :message
   :too_short text ( :minimum )
   :wrong_length ( :is)
 實例:
 class User < ActiveRecord::Base
  validates_length_of :name, :maximum => 50
  validates_length_of :password, :in => 6..20
  validates_length_of :address, :minimum => 10,
                :message =>"seems too short"
 end

validates_numericality_of
 檢驗對象是否為數值
 用法:validates_numericality_of attr… [ options... ]
 參數:message text 默認 “is not a number.”
   :on :save, :create, or :update
   :only_integer
 實例:
 class User < ActiveRecord::Base
  validates_numericality_of :height_in_meters
  validates_numericality_of :age, :only_integer => true
 end

validates_presence_of
 檢驗對象是否為空
 用法:validates_presence_of attr… [ options... ]
 參數:message text 默認:“can’t be empty.”
   :on :save, :create, or :update
 實例:
 class User < ActiveRecord::Base
  validates_presence_of :name, :address
 end

validates_uniqueness_of
 檢驗對象是否不重複
 用法:validates_uniqueness_of attr… [ options... ]
 參數:message text 默認: “has already been taken.”
   :on :save, :create, or :update
   :scope attr 指定範圍
 實例:
 class User < ActiveRecord::Base
  validates_uniqueness_of :name
 end

 class User < ActiveRecord::Base
  validates_uniqueness_of :name, :scope =>"group_id"
 end
 #指定在同一group_id的條件下不重複.

常用正則:

E-Mail地址格式:
validates_format_of     :email,
                        :with       => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i,
                        :message    => ‘email must be valid’

網址格式:
validates_uri_existence_of :url, :with =>
        /(^$)|(^(http|https)://[a-z0-9] ([-.]{1}[a-z0-9] )*.[a-z]{2,5}(([0-9]{1,5})?/.*)?$)/ix

 

發表在 Ruby on Rails | 留下評論

Ruby on Rails 的Active Record之Acts As List和Acts As Tree

Acts As List實例:
在子表中加parent_idposition

定義:
class Parent < ActiveRecord::Base
 has_many :children, :order => :position
end
class

Child < ActiveRecord::Base
 belongs_to :parent
 acts_as_list :scope => :parent_id
#:scope 指定在parent_id相同範圍內.
end

向表中添加數據:
parent = Parent.new
%w{ One Two Three Four}.each do |name|
 parent.children.create(:name => name)
end
parent.save

定義顯示方法:
def display_children(parent)
 puts parent.children.map {|child| child.name }.join(", ")
end

調用實例:
display_children(parent) #=> One, Two, Three, Four

puts parent.children[0].first? #=> true
#使用last?(), first?()判斷行位置

two = parent.children[1]
puts two.lower_item.name  #=> Three
puts two.higher_item.name #=> One
#使用.lower_item訪問下一行數據, 使用.higher_item訪問上一行數據,使用

parent.children[0].move_lower
parent.reload

display_children(parent) #=> Two, One, Three, Four
#使用mover_lower(), mover_higher()可移動行數據
#使用parent.reload刷新數據

parent.children[2].move_to_top
parent.reload
display_children(parent) #=> Three, Two, One, Four
#使用move_to_top(), move_to_bottom()移動行數據

parent.children[2].destroy
parent.reload
display_children(parent) #=> Three, Two, Four
#一行數據刪除後其下面的行會自動跟上

Acts As Tree實例:
向子表新增parent_id (int), 並將設定為表內關聯鍵

定義方法:
class Category < ActiveRecord::Base
 acts_as_tree :order =>"name"
end

向表格添加數據:
root = Category.create(:name => "Books")
fiction = root.children.create(:name =>"Fiction")
non_fiction = root.children.create(:name => "Non Fiction")

non_fiction.children.create(:name =>"Computers")
non_fiction.children.create(:name =>"Science")
non_fiction.children.create(:name =>"Art History")

fiction.children.create(:name =>"Mystery")
fiction.children.create(:name => "Romance")
fiction.children.create(:name =>"Science Fiction")

定義顯示方法:
def display_children(parent)
 puts parent.children.map {|child| child.name }.join(", ")
end

調用實例:
display_children(root) # Fiction, Non Fiction

sub_category = root.children.first
puts sub_category.children.size #=> 3
display_children(sub_category) #=> Mystery, Romance, Science Fiction

non_fiction = root.children.find(:first, :conditions => "name = ‘Non Fiction’")

display_children(non_fiction) #=> Art History, Computers, Science

puts non_fiction.parent.name #=> Books

:counter_cache => true+children_count段也可以在這裡使用.用來自動計算子錶行數.

發表在 Ruby on Rails | 一條評論

Ruby on Rails數據表格關係

一對一關係實例: one-to-one
class Order < ActiveRecord::Base
has_one :paid_order,
    :class_name =>"Order",
    :foreign_key => "order_id",
    :conditions => "paid_on is not null"
在表格上加order_id (表格名單數_id)
class Invoice < ActiveRecord::Base
belongs_to :order

可選參數:class_name, :foreign_key,  :order, :conditions
:dependent => true #刪除主錶行時同時刪除子行
自定義的order用法:
class Customer < ActiveRecord::Base
has_many :orders
has_one :most_recent_order,
    :class_name => ‘Order’,
    :order => ‘created_at DESC’
end

主.從 將被保存
an_invoice = Invoice.new(…)
order.invoice = an_invoice # invoice被保存
從.主 將要手動保存

新增加的方法:
product(force_reload=false)
product=(obj)
build_product(attributes={})
create_product(attributes={})

一對多關係(one-to-many)
class Order < ActiveRecord::Base
has_many :line_items
可選參數除了上面的,還有:exclusively_dependent, :finder_sql,:counter_sql
:exclusively_dependent 在子行沒有其它表格瓜葛的情況下使用, 加快處理速度.
:finder_sql的使用實例:
class Order < ActiveRecord::Base
has_many :rails_line_items,
     :class_name => "LineItem",
     :finder_sql => "select l. * from line_items l, products p " +
     " where l.product_id = p.id " +
     " and p.title like ‘%rails%’"
end
order的用法:
class Order < ActiveRecord::Base
has_many :line_items,
   :order =>"quantity, unit_price DESC"
end

主.從 將被保存
an_invoice = Invoice.new(…)
order.invoices <<an_invoice # invoice

class LineItem < ActiveRecord::Base
belongs_to :order
. . .

has_many後可以引用集合:
order = Order.find(123)
total = 0.0
order.line_items.each do |li|
 total += li.quantity * li.unit_price
end

新增加的方法:
orders(force_reload=false)
orders <<order
orders.push(order1, …)
orders.delete(order1, …)
orders.clear
orders.find(options…)
orders.build(attributes={})
orders.create(attributes={})

多對多關係(many-to-many):
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
. . .
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
. . .

要創建一個中間表格:
categories_products
兩表格名字複數形式相聯, 排字母前後排序

表格內連關聯鍵

預載子表
用:include將子表內容加入內存,提高查詢速度, 但損耗內存:
for post in Post.find(:all, :include => [:author, :comments])
 puts "Post: #{post.title}"
 puts "Written by: #{post.author.name}"
 puts "Last comment on: #{post.comments.first.created_on}"
end

自動計算子錶行數
 belongs_to加參數:counter_cache => true
 數據庫加 子表格名(複數)_count 段, 並加 :default=>0參數.
 然後用 .size可以讀取子錶行數.
刷新數據讀法:product.line_items(:refresh).size

發表在 Ruby on Rails | 2 條評論

越劇迷心得

1.千萬不要和戲子同去應試。因為在狀元只有一位的前提下,你同科高中的機率微乎其微。
2.女孩追男孩的最好方法就是滿地丟東西。想找郎君的女孩最好隨身帶把沉香扇或紫玉釵,如果沒有,普通的玉墜也是不錯的選擇。
3.如果想要找一個貞節烈女,那千萬要去妓院。 妓院幾乎常駐德才兼備的美女,她們守身如玉,冰清玉潔,知書達理,才華出眾,最可貴的是通常不羨慕錢權而獨愛才子,是窮苦書生泡妞的首選寶地。
4.鑒於《玉蜻蜓》,《碧玉簪》,《玉鐲記》,《紫玉釵》等名戲鋪道, 最好寫古代戲,因為現代人基本上不戴首飾,所以為現代戲起名將成為一大難題。
5.要時常留意府里收的書童或雜工,因為他們很可能是那位公子為拐騙女兒而裝扮進來的。

發表在 越劇柔情 | 留下評論