全新新手自己看網路資料自學中 (Ruby 2.1.5 on Rails 4.2.0)
想請教請教, 問題比較初級, 請多包涵
一直看不是很懂ActiveRecord某些點
※ 引述《ihower (好2ˇ)》之銘言:
: ※ 引述《tonytonyjan (南洋大兜蟲)》之銘言:
: : 環境:
: : Rails ~> 3.0.0
: : 狀況:
: : 在閱讀文章、書籍的時候,看到每個人都說
: : has_one, belongs_to後面要放單數的association_id
: : has_many, has_and_belongs_to_many及:through後面要放複數
: : 但是皆知其然不知其所以然
: : 那些association_id的域名來自哪裡?
: : 是DB中已存在的table name嗎?還是已存在的model name呢?
: 這幾個association方法都有參數是 :foreign_key 和 :class_name
: 這兩個值通常不需要設定, 因為rails會依照慣例幫你設定
: belongs_to :user 等同於
: belongs_to :user, :foreign_key => :user_id, :class_name => "User"
第一)
對belongs_to的部分是看懂了, 依照慣例會對應到class的名稱
但我有個部分不太懂, 假如是has_many 而剛好複數的字眼不是單純加上s的呢?
例如 (看國外範例講的 但沒看懂為什麼)
在article.rb中
belongs_to :category #這部分理解了慣例
在category.rb中
has_many :categories #這部分不理解為何Rails會知道對應到Category class呢?
第二)
為何加入has_many, belongs_to就能做到一對多, 多對一的效果?
在schema.rb並沒有看到t.reference呀?
而在migration檔案中還需要特定去指定嗎? (有些網站說要, 有些說不要)
難道不需要去修改DB的data model嗎?
不太理解背後的運作原理, 因為migration也沒有設定的話,
做rake db:migration也不會改變data model才對
為何可以做到資料關聯呢? 至少belongs_to關聯的資料表需要增加一個對方id欄位啊
第三)
目前理解似乎是
a) 對資料物件(model)而言, 假如是資料屬性attribute, 則是透過建立migration檔案
設定attributes, 在rake db:migrate時, 更新資料庫data model, 並且生成一份最新
的schema.rb檔, 類似資料庫的DDL
b) 對資料物件而言, 假如是物件之間的關聯屬性, 則透過XXModel.rb去做設定維護,
但設定維護的has_many :YYs這些方法,
是Rails自動在XXmodel.rb中加入一個method YYs可以去關聯汲取YY的資料
但是這些關聯都是寫在callback內, 並沒有真正的在對方的資料表建立FK
(沒有透過db fk constraint, 只是欄位ID值本身是對應的)
但還是不太理解為何Rails會自動找到對應的資料表? 特別像是has_many :categories
(難道像是這樣的名詞就需要手動設定t.references?? 有點被多個範例搞混了)
也還是不太理解為何資料表如何被增加欄位,
因為並沒有看到has_many/belongs_to的關聯法需要做db:migrate
到底是如何影響database physical schema的呢?
懇請賜教!! 看許多網站資料眾說紛紜, 不知何者為真, 感謝!!
(是data warehouse背景, 寫SQL習慣了, 越看ActiveRecord越不懂,
實在很需要各位解惑, 網上各種答案都有很糊塗, 謝謝)
: 至於DB的table叫啥,依照慣例則是Model名字的複數:
: class UserJob < ActiveRecord::Base
: end
: 等同於
: class UserJob < ActiveRecord::Base
: set_table_name :user_jobs
: set_primary_key :id
: end
: 因此, 如果你通通依照rails慣例, 你就不需要寫 set_table_name,
: set_primary_key, :foreign_key, :class_name....這些參數了, 這就叫
: 慣例勝於設定(Convention Over Configuration)原則
: : 我如果故意單數寫複數,複數寫單數,仍可以運作嗎?
: no, 除非你手動指定 :foreign_key 和 :class_name 等