Rails 想請問關於 Table 的規劃

hechian · 2012年01月02日 · 最后由 hechian 回复于 2012年02月04日 · 2991 次阅读

各位新年好,我這邊有個小問題想請教大家一下 (希望不介意我此文也貼在 ruby-taiwan 那邊,因為我是在台灣站先發的,且不熟悉大陸用詞,若有看不懂的部分請回應,我會再做編修解釋,感謝。)

就是我現在遇到了兩個問題:

1. 我現在有個 Model 叫做 Log,這個 Log 用來記錄 User 的操作,譬如說登入、投票等 而 Log 有欄位:target_typetarget_id兩個,這個target_type可能會是"User""Vote",而 target_id就有可能是存放user.id或者vote.id了 可是我這樣在取得 Log 的時候,要怎樣透過log.target去取得目標物件呢? 可以在 Log.rb 中belongs_to設定什麼來做這個 Mapping 嗎?

2. 我現在另外一個需求是,我得實作一個投票的系統,可以針對不同的產品來分配不同的表供使用者做投票之用,譬如說我有產品叫做:Water 跟 Cola 兩個,這兩個產品會有不同的表:VoteForWaterVoteForColoa,那我有沒有辦法透過一個 Model 搭配一個參數 (譬如說是vote.for) 來讓 Rails 自己儲存到對應的表呢?

vote.for = "water"; vote.save #=> 儲存到VoteForWater
vote2.for = "cola"; vote2.save #=> 儲存到VoteForCola

感謝

  1. 由於 belongs_to 的:class_name 選項只能是字符串,應該無法通過一個 belongs_to 來關聯“User”和“Vote”。我的一個項目中有類似的情況,我是這樣實現的:@target ||= Kernel.const_get(self.target_type.to_sym).find(self.target_id)

  2. 這個是不是可以用 single table inheritance 實現呢?

  1. 那我這個部分再想想看好了,若有搞定再來分享作法
  2. 之所以不用一個表來實現,是因為這個表可能會很大,而且某些產品的生命週期很短,若要移除掉的話又有可能資料不連續,所以才會想拆成多表來做
  1. 可以用 Polymorphic Associations 来处理 Log 和不同类型的 target 之间的关系,具体参照文档:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
  2. 我建议 Vote 也不要分成两个表,仍然可以用 Polymorphic Associations 来处理
  1. 那想請問各位,如果不分兩個表的話,單一的表過於龐大要怎樣提高效能呢?對這個我有點頭疼呢 :(

對於問題 2,相信 rails 早期的 plugin 仍然有可供借鑑的地方。 例如 http://blog.peteonrails.com/?page_id=60 http://juixe.com/techknow/index.php/2006/06/24/acts-as-voteable-rails-plugin/

對問題 1:已經解決了,謝謝 @yorzi@clc3123 兩位 對問題 2:我還需試試,謝謝各位,我做實作成功後再做個記錄貼上來,感謝。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号