一對一關聯會直接載入 model
假如我們有 user model 如下:
class User < ActiveRecord::Base |
在 Rails 中 has_one
, belongs_to
所定義的是一對一關聯
。在操作這種關聯時,Rails 會直接下 SQL query 載入該物件,而不會給你一個 relation,讓你可以做進一步的操作(下 where 條件、joins 條件之類的)。
我們可以看到下面例子:
user.profile.class |
touch
但有時候我們會想要直接 update 一對一的關聯,例如我們想要 touch 一下 user 的 profile。這時候因為 Rails 這項特性的關係,我們不能直接下 query 去更新,一定要先撈出 profile 物件、呼叫 touch 函式,函式再 update 資料回 database。
user.profile.touch |
column = column + ?
或者是我們要直接進行 SQL 層操作,例如 user 獲得 10 點點數。我們一樣也是不能直接下 query 去更新,要先撈出 profile 物件,再從 profile id 去下 SQL 語句更新。
Profile.where(id: user.profile).update_all('point = point + 10') |
Use association_scope
其實 Rails 的 Association
上有 association_scope
函式,可以取得 association 的 scope!而 association 物件的話,也可以藉由呼叫 model 上的 association 函式取得
profile_association = user.association(:profile) |
取得 relation 後,要進行各種 SQL 的操作就很方便啦:
# touch |