進入Rails世界必須懂:Model 關聯性 (1:1)
想好好學會 rails,不得不好好認識相當重要的關聯性,能夠理解並善用的話,你就能在各個 model 之間進行資料庫的溝通,拿到你想要的資料。
Model 關聯性Rails 的 Model 關聯主要有三種類型
一對一 (1:1)
一對多 (1:N)
多對多 (N:N)
今天這部分章節,會優先介紹 1 對 1。我們用實際的例子來進行說明會更加清楚。
1:1 一對一假如我們今天想要開一間飲料店我們會有一個店長 Owner一個店長會有一間店 Store
假設每個店長可以開一間店,這種關係就是一對一的關係。=> Owner has one store
可以先從 rails 中產生 Owner 的 Model 並生成對應的資料表來記錄店長的資訊
1rails g model Owner name phone:integer
再產生 Store 的 Model 並生成對應的資料表來記錄商店的資訊,由於需要多一個 owner_id 所以透過指令 owner:references 或是 owner:belongs_to 來產生,這一個欄位可以讓我們知道
12rails g mo ...
瀏覽器輸入網址後到出現頁面會發生什麼事情?
最近面試被問到這個問題,發現裡面觀念牽涉很廣,每個步驟都可以單獨找到很多觀念跟理論,簡單分享以下四個主要的步驟。
1. 輸入網址使用者輸入 (假設 https://google.com/maps/search/shop )因為瀏覽器無法根據 URL (Uniform Resource Locator) 直接定位到對應的資源,而是要根據 ip 才能找到,所以必須進行域名的解析
2. 進行域名解析 DNS(Domain Name System) 得到 IP瀏覽器透過作業系統從中解析出「通訊協定(Protocol)」、「網域(Domain)」、「路徑(Path)」等資訊,經過本地瀏覽器快取及 DNS server 等查找方式來找到跟這些域名對應的 ip 位置
查找 ip 的順序 1. 檢查本地的 DNS 快取 2. 檢查電腦中的 .host 檔 3. 向 DNS 伺服器發送詢問
找到 ip 後丟回給瀏覽器,瀏覽器根據解析出的 IP,開始建立連線
3. TCP (Transmission Control Protocol)開始進行三次握手建立連線透過 TCP/IP 協議 (是一種 ...
進入Rails世界必須懂:Migration
Migration 是什麼就是一個紀錄「資料庫的架構」的檔案,我們可以知道目前資料庫的欄位有什麼?、型態是什麼?,也可以知道目前修改的紀錄與過程。可以跟著 git 一起把資料庫架構變更的進行版本控制。
建立 Migration利用之前 article 的例子來看,先產生一個 article 的 modelrails g model Article title content:text
會長出下面的 migration 紀錄
12345678910class CreateArticles < ActiveRecord::Migration[6.1] def change create_table :articles do |t| t.string :title t.text :content t.timestamps end endend
看到有 title 及 content 資訊,還有先前文章提到 id (不會顯示) 及 timestamps。
這邊只是先將資料表的內容描述好,需要進行 rails db:migrate 這個指令之 ...
進入Rails世界必須懂:Model 相關介紹 及 CRUD (下)
接著上一篇我們繼續說明用 ORM 來操作 CRUD 的部分 關於讀取的部分還可以怎麼去找到,還有後面的 update 及 delete 的說明。
更精準的讀取 find & find_by & Wherefind & find_by
用 find 來找 idModel.find(:id)find_by 可以找特定欄位的資訊是否有對應的資料Model.find_by(欄位名: 值)
兩者的差異:
find 只能找 id,find_by 可以找任何資料表內的東西
find 找不到會出錯, find_by 只會回傳 nil
12345678910113.0.0 :001 > a1 = Article.find(1) Article Load (0.2ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT ? [["id", 1], ["LIMIT" ...
進入Rails世界必須懂:Model 相關介紹 及 CRUD (上)
Model前面的章節有提到過 Model 其實就是一個幫忙與資料庫溝通的地方,他既不是資料庫(Database)也不是資料表(Table),Model 可以當成一個抽象類別,負責跟實體的資料表溝通。
CRUD先來簡單說文解字一下這四個基本的字,”CRUD”的意義吧!主要是描述下面這四個字。
Create (C) 新增,建立資料,將定義好的欄位寫入對應的值
Read (R) 讀取,讀取資料,查詢資料的相關內容
Update (U) 更新,更新特定欄位的資料
Delete (D) 刪除,刪除資料
我們可以透過基本的 ORM 操作來感受一下 rails 如何用到上面的這些操作資料的動作吧,操作前先簡單解釋一下相關的專有名詞,也是許多面試常常會問到的觀念。
ORM?ORM 是 Object Relational Mapping 的縮寫,翻譯成「物件關聯對映」。如果想要存取資料庫裡的內容,在以前必須自己撰寫資料庫查詢語言(SQL)對資料庫進行查詢,但透過 ORM 的技術包裝之後,可以讓我們用操作「物件」的方式來操作資料庫。
Active Record?Active Record 是一種設計模 ...
進入Rails世界必須懂:Controller 及 View
開頭先來回顧一下前面的圖片,今天來解釋一下我們 MVC 一直提到的 C (Controller) 及 C (View) 部分,前兩篇講完 routes 的部分,接著當解讀完 routes 之後就是將工作轉往 controller 及 action 的部分,將後續資料的呈現及使用者的動作做完。
Controller 與 V iew 是什麼呢?Controller 是要拿來做什麼用的? 從意思來看應該可以看到 control 這個單字,表示是要來進行一些控制的部分,主要是控制資料的流程。他可能會進行:
跟 Model 要資料
把從 Model 收到的資料丟給 View
需要存取外部服務(例如金流串接)等
View 的話則是可以將 Controller 的資料呈現出來,就是一種回傳 HTML 的方法。
和路徑設定的關聯前面一篇提到的文章相關路徑設計,其實我們 resources 後面符號,用複數名稱對應到的就是 controller 的名字
123Rails.application.routes.draw do resources :articlesend
還記得路徑中有對應的 ...
進入Rails世界必須懂:Routes (下)
延續前面基本的路徑設計,這篇會提到比較多種巢狀設計的方式。
巢狀設計方式resources 方法裡面其實還可以在包 resources,在後面會提到 model 之間關連性,例如一個 User 可能會有很多 Articles,Route 可能會這樣寫:
12345Rails.application.routes.draw do resources :users do resource :articles endend
終端機輸入 $ rails routes -c articles 查詢路徑可以看到如下
12345678 Prefix Verb URI Pattern Controller#Action new_user_articles GET /users/:user_id/articles/new(.:format) articles#newedit_user_articles GET /users/:user_id/articles/edit(.:format) arti ...
進入Rails世界必須懂:Routes (上)
前面 MVC 中德概念有提到 Restful Routes 設計很重要,今天就來簡單講一下基本的路徑 Routes 設定吧!
路徑設定位置通常我們會在 config/routes.rb 的檔案裡面進行路徑的設定:
12345Rails.application.routes.draw do get "/", to: "pages#index" #去首頁 get "/about", to: "pages#about" #去關於我們的頁面 # 動作 “路徑”, to: "controller#action"end
一般設定就如上面這樣,會先指定動作,再來是要去的路徑,接著是對應的 controller,”#”後面是 controller 上面的 action。
用 resources 產生的 Routes這邊可以感受到慣例優於設定的一個小地方,使用 Rails 提供的 resources 方法非常方便,可以自動產生出對應的 8 條路徑、7 種 action,可以應付一般 ...
進入Rails世界必須懂:MVC 是甚麼?
最近開始進行一些面試,真的深刻感受到這個問題的重要,算是寫 rails 根本的概念了吧,應該有接觸後端框架或是網業開發必備的設計概念,今天也被面試官問到,如果要跟沒程式經驗的小白解釋的話要怎麼說明,所以就打算用個淺顯易懂的方式來說明觀念吧!!
白話文來解釋 MVC最近大家好像都開始蠢蠢動,因為防疫限制的鬆綁所以紛紛開始出國,就拿我們辦個護照的例子來說明好啦。先想像一下,今天你走進去外交部領事事務局,因為初來乍到所以不熟悉這邊的行政單位在哪,就找了一樓服務台的阿姨問了一下辦理護照需要去哪邊?
阿姨告訴你說請到 3 樓的申辦櫃台去進行辦理,於是你走到 3 樓,找到櫃檯跟他說你要辦理護照,他請你填寫一些基本資料,並且附上對應的照片等等,然後就幫你把你的資料送到收件的地方並且核對你的資料,後續根據你的相關紀錄,確認都有符合辦理的條件後,就把製作好的護照交給你手上。
其實剛剛很生活的例子就完全解釋了我們整個 mvc 的運作架構,接下來一一說明一下吧。
白話之後也對應網頁運作上邊特別標註的一些名詞其實都是對應我們 MVC 的一些概念喔,像是服務台阿姨其實扮演著 Route 的角色,就是表示當使用者 ...
掌握Ruby世界就要先懂:模組 Module
這篇就來好好了解一下 Ruby 中的模組吧,先來用個我最愛的超級英雄蜘蛛人當成例子以前面人類類別的例子,我希望他可以有吐絲的能力來當蜘蛛人,可能會想用以下這些做法:
建立一個蜘蛛類別並且帶有吐絲功能,然後再叫人類類別去繼承
在人類類別裡面定義一個吐絲功能
第 1 種的方式感覺在邏輯上比較奇怪,人為了吐絲就要去繼承蜘蛛,感覺就跟原本設定的類別有點衝突;第 2 種是直接寫在內部確實也可以達到同樣效果,但如果其他類別也需要用到這項能力就要另外在寫,沒辦法抽出來共用。
如果我們能夠把這些超級能力抽出來,需要使用再引入,不是很好嗎?於是就有了模組的概念可以來解決這樣的狀況!
模組定義與使用module 後面接上模組名稱,命名規則與 class 相同,使用駝峰大寫,下面就可以定義內部要有的方法。如果在其他類別內要引用就使用 include。
1234567891011121314# 定義吐司模組module spinning def spin puts "我會吐絲啦!" endend# 引入模組到人類類別class Human include spinning ...