Ruby on Rails-Active record 練習

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