About some weird Convention

我們都知道 Ruby on Rails 有個稱作慣例優於設定(Convention Over Configuration) 的原則。不過,這慣例常常會坑人,端看你對 Ruby on Rails 的理解究竟有多少。
對於什麼事情都有個人看法的我來說,慣例的設計原則把我害得很慘很慘……

這篇來講兩個慣例的坑:\

  1. 單複數問題
  2. belongs_tohas_many 的問題

首先來談談單複數問題:
在英文裡面,單數與複數是有區別的,而且常常有許多規則與例外;可是漢語語境下,並不區分單數複數。聽說日語也不太區分。
身為一位漢語母語用者,用上了英文為主的 rails、會覺得 rails 的單數複數慣例不自然,也是理所當然的慣例(咦)

老實說,我還是很難掌握使用單數或複數的時機。


接著是 belongs_tohas_many 的問題:
當我在實做刪除功能的時候,發生了這樣的問題:

SQLite3::SQLException: no such column: bar.foo_id: SELECT...

沒有找到東西刪除?這怎麼可能?當下,我先使用 byebug 檢查看看變數,一切正常。接著我使用很土砲的 puts 指令,想挖挖看有沒有其他問題。
當然也沒有。我就此困惑了。
待我盯著錯誤訊息許久,才意識到是 bar 是屬於 foo 的資料。我決定去比對這兩個 model 檔案:

# In models/foo.rb
class Foo < ActiveRecord::Base
    has_many :Bar, dependent: :destroy
end

# In models/bar.rb
class Bar < ActiveRecord::Base
    belongs_to :Foo
end

……沒有問題啊?
直到我想起自己是要做投票功能,所以參考了 RailsBridge 的說明。那就先在 console 輸入看看好了:

ActiveModel::UnknownAttributeError: unknown attribute 'foo_id' for Bar.

WTF? 這什麼奇怪的變數?「慣例」是這樣搞?

雖然最後透過修改 migrate 檔案解決了問題,但慣例卻還是深深困惑住我。

參考資料

關於 belongs_tohas_many 的問題:

  1. Rails Associations: SQLite3::SQLException: no such column
  2. Rails 4 - Has_many through - StatementInvalid - SQLite3::SQLException: no such column: