ActiveRecord 關係
以下內容紀錄 RoR 中,資料物件間的關係.
主要關係
belongs_to
相機 belongs_to 我:
這台相機是我的,同時也可以是其他人的.
build_<association> vs create_<association>
slide.build_photo({:filename => "1.jpg"})
=> #<Photo id: nil, filename: "1.jpg", created_at: nil, updated_at: nil>
slide.create_photo({:filename => "1.jpg"})
=> #<Photo id: 3, filename: "1.jpg", created_at: "2008-03-06 17:16:04", updated_at: "2008-03-06 17:16:04">
build_<associationh> "不"會在 DB 上產生資料, create_<association> 會在 DB 上產生資料.
has_many
has_many 是 belongs_to 關係的另一端(一對多關係).
我 has_many ----- belongs_to 相機.
has_one
has_one 是 belongs_to 關係的另一端(一對一關係).
資料表中有外鍵的類別使用 belongs_to.
ex: 相機的資料表中,有指到人的外鍵( people_id)
-> 那就要在 camera 中寫上 belongs_to :people
has_and_belongs_to_many
多對多關係. 不再倚賴單一的外鍵欄位,而是利用額外的關係資料表來紀錄多對多關係.
輔助關係
rails 2.0 的 acts_as_xxx 都被轉移到官方 Plug-in 中. 利用下列指令安裝:
./script/plugin install act_as_xxx
練習時遇到問題:
Q: NetBeans 自動補齊程式碼.
A: Ctrl + \ (更多請參考 http://wiki.netbeans.org/RubyShortcuts )
一下 Eclipse 一下 NetBeans ,幹我真的會錯亂! Orz
Q: 使用 belongs_to 時,遇到命名規則問題.
A:
belongs_to 後面的 symbol 使用單數名詞 ( ex: :slide_show ).
has_many 後面的 symbol 使用複數名詞 (ex: :slide_shows ).
Q: 使用 form_for 時,會發生 undefined method 'XXX_path' for #<ActionView::Base>.
A:
form_for 會去找尋 XXX_path 這個方法. 我一開始利用 scaffold 自己產生 XXX model 相關的程式碼時.它會自動去 Configurtion/routes.rb 加入 XXXs_controller 的對映. # Sample resource route (maps HTTP verbs to controller actions automatically):
map.resources :photos # scaffold 自己會填入.
map.resources :slideshows # 沒有透過 scaffold 就要自己寫入.
map.resources :categories # 沒有透過 scaffold 就要自己寫入.
Q: 不同 View 想使用共用的片段介面.
A:
使用 Partial 的方式. 參考 http://www.uuzone.com/club/21274/forum/284387.htm
建立 _form.html.erb在要使用該片段的介面裡面加上 <%= render :partial => 'form' %>
Q: paginate 失效!
A: 參考 http://www.javaworld.com.tw/jute/post/view?bid=59&id=213750&sty=1&tpg=1&age=0 ,內有所有 RoR 取消的方法. paginate 被 will_paginate 取代.
官方 will_paginate 安裝方式: http://rock.errtheblog.com/will_paginate
下載位置(有可能失效):
will_paginate (svn://errtheblog.com/svn/plugins/will_paginate)
classic_pagination (svn://errtheblog.com/svn/plugins/classic_pagination)
安裝日期為 2008/3/12,不保證之後 will_paginate 作者不會改變作法. 以下為經過無數次失敗的血淚紀錄,一度讓我不想再學習 RoR :
- X 透過 gems 安裝,然後在 Configuration/environment.rb 內加入 require 'will_paginate'
- X 將 gems 捉回來的 will_paginate 放到 <你的應用程式>/vendor/plugins 下.
- X 透過 svn 下載的方式( NetBeans 安裝 New Plugin + 安裝 svn )已經失效,什麼鬼都沒有下載回來.
- O 直接下載 http://github.com/mislav/will_paginate/tarball/master ,解壓縮後改名為 will_paginate (非必要) 放至 <你的應用程式>/vendor/plugins 下,終於成功!
Q: 利用 DB 來存放 Session 資料後,發生 No :secret given to the #protect_from_forgery call. Set that or use a session store capable of generating its own keys (Cookie Session Store).
A: 至 ApplicationController 將 protect_from_forgery 後面的註解取消掉.
延伸閱讀:
JavaEye3.0開發手記之一 - 我的開發環境
Rolling with Rails 2.0 - Part
Rails 2.0 搶鮮版釋出!
RESTful Rails - 簡單心得
RESTful Rails 2.0 , part 1: scaffolding
Upgrade to Rails 2.0.2
My Rails Way
主题:在Rails2.0当中被废弃的用法提示
1 則回應:
我有段時間沒寫 ROR 了!
看Console吐出來訊息:
* 應該是您安裝了scaffold。
* 但還沒有成功安裝pagination。
根據 http://www.javaeye.com/topic/152475
Rails2.0.2把scaffold 剝離為插件,也就是說Rails2.0.2里面不能直接使用scaffold了,而書中的版本與最新版還是對不上,所以需要重新安裝,而且需要安裝兩個plugin
1. 執行 以下語句 安裝scaffolding
ruby script/plugin install scaffolding
2. 分頁插件的解決方法
狀況如下:
undefined method `paginate'
解決辦法:安裝老的classic_pagination
ruby script/plugin install http://tools.assembla.com/svn/breakout/breakout/vendor/plugins/classic_pagination/
2009/10/6 曹 仲逵
Dear 唐先生,你好:
針對唐先生在部落格所發表的Rails分頁問題,想跟你請問一些問題.
http://tangblack.blogspot.com/2008/03/ruby-on-rails-active-record.html
O 直接下載 http://github.com/mislav/will_paginate/tarball/master ,解壓縮後改名為 will_paginate (非必要) 放至 #{你的應用程式}/vendor/plugins 下,終於成功!
放到/vendor/plugins後,我ruby server重新啟動,但頁面仍然找不到,出現以下錯誤
undefined method `paginate' for #ScaffoldController:0x3647af0