has_many and find (2)
承上,其實 rails 這樣做可能還違反 LSP.
http://en.wikipedia.org/wiki/Liskov_substitution_principle
雖然 LSP 通常是指 static typing 的語言,
但我認為這可以在 ruby 上延伸解釋,像是原本 LSP
是在說 derived class (c++ term), 但在 ruby 上
可以視為絕對不要任意改變某個 method 的 semantic.
以前例而言:
[1, 2, 3].class # => Array
[1, 2, 3].find{ |i| i == 2 } # => 2
user.habit_contents.class # => Array
user.habit_contents.find{ |i| i == 2 }
ActiveRecord::RecordNotFound:
Couldn't find HabitContent without an ID
........這比違反 LSP 還更嚴重不是?
ruby 不是說 principle of least surprise?
越想越覺得 rails 非常 dirty.
2 retries:
嗯..這個..
問題應該是
user.habit_contents.class
不應該傳回 Array
而是 AssociationProxy 才對
也是一個方法,不過我還是覺得改名字會比較好一點
例如 query 之類的
如果說為了跟 Model.find 有同樣的名字
那乾脆用 Model.query
總之不要衝突...
Post a Comment
Note: Only a member of this blog may post a comment.