iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
自我挑戰組

Ruby on Rails JS系列 第 17

Ruby on Rails Model 基本操作之 CRUD CRUD 之 C(Create)

什麼是 ORM?
ORM 是 Object Relational Mapping 的縮寫,中⽂翻譯成「物件關係對映」。我們
如果想要存取資料庫裡的內容,在以前必須⾃⼰撰寫資料庫查詢語⾔(SQL)對資
料庫進⾏查詢,但透過 ORM 的包裝之後,可以讓我們⽤操作「物件」的⽅式來操
作資料庫。例如如果我想要找出所有 users 資料表裡的資料:
User.all
這句透過 ORM 的轉換之後會變成:
select * from users;
CRUD 之 C(Create)
要透過 Model 新增⼀筆資料有 new 跟 create 這兩種⽅式。使⽤ new ⽅法做
出⼀個 Model 物件後,再執⾏ save ⽅法即可把該筆資料存入資料表:

user = Candidate.new(name: "孫悟空", age: 18)
user.save

當執⾏ save ⽅法的時候,Model 會產⽣這樣的 SQL 語法,把資料寫入
candidates 資料表:

INSERT INTO "candidates" ("name", "age", "created_at", "updated_a
16 Model 基本操作
243
t") VALUES (?, ?, ?, ?) [["name", "孫悟空"], ["age", 18], ["creat
ed_at", "2017-06-28 02:42:27.066729"], ["updated_at", "2017-06-28
02:42:27.066729"]]

除了 new + save ⽅法可以新增資料,使⽤ create ⽅法也可新增資料,但不
需要執⾏ save ⽅法即可寫入資料表:
Candidate.create(name: "孫悟空", age: 18)
new 跟 create 的差別,就是 new ⽅法只是先把物件做出來,除非執⾏了
save ⽅法,資料不會存入資料表;⽽ create ⽅法則是直接把存入資料表。不
管是 new 或 create ,在寫入失敗的時候都會回傳⼀個「內容都是 nil 的 Model
物件」(注意,不是回傳 nil 物件喔),通常在 Controller 的 Action 裡常會藉此
判定資料寫入是否成功:

class PostsController < ApplicationController
# ...[略]...
def create
@post = Post.new(post_params)
if @post.save # 如果存檔成功...
redirect_to @post, notice: 'Post was successfully created.'
else
render :new
end
end
end

另外, create ⽅法有另⼀個叫做 create! 的兄弟⽅法(沒錯,就是後⾯加了驚
嘆號版本的),它跟 create ⽅法⼀樣會把資料直接寫入資料表,當資料寫入發⽣
錯誤時, create ⽅法會默默的回傳 nil (事實上是⼀個 Model 物件),⽽
create! ⽅法則會產⽣例外(Exception)訊息。

參考資料

[為你自己學Ruby on Rails]https://railsbook.tw/chapters/08-ruby-basic-4.html


上一篇
Ruby on Rails Controller
下一篇
Ruby on Rails CRUD 之 R(Read)
系列文
Ruby on Rails JS29

尚未有邦友留言

立即登入留言