foreign_key and associations

問題

這篇主要要討論的地方是foreign_key在has_xxx與belongs_to的關聯裡扮演著怎樣的角色。
我有一筆OrderItem的資料主要是用來記住被下單的產品detail,但我不想把product也有的欄位(name & price)再複製一份到OrderItem裡,所以我的orderItem裡有個product_id欄位只記錄prdduct id然後用關聯的方式去找product,所以問題就是我該用has_XXX的方式關聯還是用belongs_to的方式關聯。

#<OrderItem:0x007fa55187d7c0> {

            :id => 1,
      :order_id => 1,
    :product_id => 2,
      :quantity => nil,
    :created_at => Mon, 13 Jun 2016 09:21:16 UTC +00:00,
    :updated_at => Mon, 13 Jun 2016 09:21:16 UTC +00:00
}

過程

try &error 1

在一開始我用了has_one :product , foreign_key:"product_id"這樣的方式去關聯,然後當我用了orderItem.product的時候就被報錯了,原因是在product table裡找不到叫做product_id的欄位。

try &error 2

後來我用了has_one :product , foreign_key:"id"這樣的方式去關聯,然後當我用了orderItem.product的時候product的資料有出來,但是出現的卻是id = 1的資料,這時候我就知道這也是錯的資料因為要取到product id = 2的資料才是對的。

try &error 3

最後用了belongs_to :product , foreign_key:"product_id"`這樣的方式去關聯,最終取到了我要的資料。

解釋

原來has_XXX跟belongs_to之間的差別是在
belongs_to ---> 從自己 model 的 column 當 foreign_key。
has_xxx ---> 從別的 model 的 column 當 foreign_key。

當我用has_one :product , foreign_key:"product_id"這樣的方式去關聯,是orderItem拿自己的id去product裡面找product_id欄位所得出的資料,當然在我的product model裡並沒有這個product_id欄位所以會報錯。

當我用has_one :product , foreign_key:"id"這樣的方式去關聯,是orderItem拿自己的id去product裡面找id欄位所得出的資料,所以才會找到product id = 1的資料,但這也不是我要的資料。

當我用belongs_to :product , foreign_key:"product_id"這樣的方式去關聯,是orderItem拿自己的product_id欄位去找product table找資料。這才是我要的。

結論

有時候覺得自己好像已經懂了某些東西的用法,但當遇到問題時才會瞭解到原來自己不懂啊!!
has_xxx &belongs_to 看起來好像就是要從哪裡開始找資料而已,沒有想到原來有用到foreign_key跟用誰的column當作foreign_key這樣的差別,所以紀錄一下。

comments powered by Disqus