What have you found for these years?

2008-10-30

氣死人 rails 規則又不統一

碰到蠢問題,active_support 說:

'quota'.pluralize # => 'quotas'

而 extlib 則說:

'quota'.pluralize # => 'quotum'

所以當我捨棄 aquarium 的 hook 取 extlib 的 hook 後,
class Quota 的 table_name 變成 'quotum' ...

fine, 那我們用 rails 的 inflection 來改變規則吧。
當然,根本的問題是出在不該 require 'extlib/inflection',
所以我後來也把:

config.gem 'extlib', :version => '>=0.9.5', :lib => 'extlib'

改成:

config.gem 'extlib', :version => '>=0.9.5', :lib => 'extlib/assertions'
config.gem 'extlib', :version => '>=0.9.5', :lib => 'extlib/hook'

但是,心裡想著既然 quota 的 pl. 是 quotum, 那把 rails 改過來也沒什麼不好?
於是加上了:

ActiveSupport::Inflector.inflections do |inflect|
inflect.plural 'quota', 'quotum'
end

結果這下可好,當你說:

user.quotum 時,rails 居然去找 Quotum 這個 class!
也發現不能只寫 quota 的 plural 是 quotum, singular 也要自己寫一次!
因為現在這樣的話,寫:

'quotum'.classify # => 'Quotum'

而加上:

inflect.singular 'quotum', 'quota' # stupid rails

後,才能正常顯示:

'quotum'.classify # => 'Quota'

你告訴我哪個字是 singular 和 plural 沒有一對一 mapping 的 @@
我猜應該是有啦... 但那應該是不同意思的字吧?而且應該很少數吧?

extlib 可是一行就搞定:

Extlib::Inflection.plural_rule 'quota', 'quotas'

上面這行是原本為了讓 DataMapper 去對應 rails 寫的,
現在要讓 rails 去對應 DataMapper 就沒有用到了。

但光是這樣也是沒有用的! user.quotum 還是去找 Quotum!
source code 看半天,不知道他內部到底是玩什麼花招?
看到覺得很煩,只好乾脆再加上:

has_many :quotum, :order => 'date DESC',
:dependent => :destroy, :class_name => 'Quota' # stupid rails

這樣總行了吧??結果還真的是要這樣才行。
既然都有 classify 了,遵照那個規則不行嗎...
我看他那 source code, 只看到 name.camelize,
這個意思是 has_many :users 也應該去看 Users 而不是 User,
不知道到底是哪裡還有 magic, 我懶得追蹤了...

反正改用 DataMapper 是勢在必行啊啊啊啊。
跟 rails 底層打交道只會浪費時間而已...

7 retries:

Anonymous said...

'quota'.pluralize # => 'quotum' 應該是bug,因為-um是單數,-a是其對應的複數。

Lin Jen-Shin (godfat) said...

啊!謝謝!
看來那時候沒細查 XD
(還有英文不好 :s)

Anonymous said...

這和英文無關,那是拉丁文來的字才會有這樣怪異的單複數 XD

Lin Jen-Shin (godfat) said...

..XD

Lin Jen-Shin (godfat) said...

那拉丁文不好 XD

Plumm said...

之前 godfat 還說喜歡拉丁文的

Lin Jen-Shin (godfat) said...

不好是不擅長的意思
not good at

Post a Comment

Note: Only a member of this blog may post a comment.



All texts are licensed under CC Attribution 3.0