Ruby
Ruby Regexp MatchData
=~ Operator
回傳比對的位置到的起始位置,沒有比對到則回傳 nil
1 | /cat/ =~ 'hiakiicat' # => 6 |
match method
有 match 到會回傳 MatchData,如果沒有 match 到則會回傳 nil。
1 | m = /akii(.+)$/.match('hiakiicat') |
括號起來的資料 (...)
才會另外存成一個值。如果不想要另外存成一個值,可以在括號裡面打 (?:...)
。
獲取資料:
m[0]
為 match 到的所有資料。m[1]
為第一個括號裡面所比對到的資料,以此類推。
1 | m[0] # => "akiicat" |
Ruby on Rails long string id
之前有講到使用 UUID 當作 primary key 的方法,因為 postgresql 有提供 uuid,可以直接拿來使用。
接下來的這個方法適用於所有的資料庫,在物件儲存之前先給定它的 id,如此一來就能定義我們所想要的內容了。
先隨便用鷹架產生點東西:
1 | rails g scaffold book title |
加上 id: :string
讓 id 的型態為 string。
1 | # db/migrate/20170218105724_create_books.rb |
Ruby on Rails 5 dynamic subdomains
一個使用者有名字 name 還有自己網頁的子網域 subdomain,我們想要的結果是讓每一位使用者有自己的子網域,而且還可以隨時更改。
假設現在有個使用者是 User.create(name: "akii", subdomain: "akiicat")
,在 rails 預設 show 頁面會是 http://localhost:3000/users/1
,但我們想把網址變成個人的子網域 http://akiicat.localhost:3000
。
接下來會用鷹架建立使用者來做示範:
1 | rails g scaffold user name subdomain |
修改 routes.rb
,加上首頁,然後把 show 的頁面加上 subdomains 的限制。
1 | # config/routes.rb |
Ruby on Rails 5 api subdomain
為了要 demo api subdomain 的頁面是否能夠運作,這邊用鷹架隨便建立個東西。
1 | rails g scaffold api::v1::books title |
使用 constraints 限制 subdomain: 'api'
。
然後用 scope module: 'api'
加上 app/controllers/api 這個資料夾。
1 | # config/routes.rb |
Ruby on Rails callback 筆記
可用的 callback
以下是 Active Record 可用的 callback,依照執行順序排序:
新建物件
1 | before_validation |
更新物件
1 | before_validation |
Ruby on Rails foreign key must exist 的問題
rails 在這次的更動之後,如果 belongs_to 的 foreign key 不存在的時,會產生驗證錯誤。
1 | class Author < ActiveRecord::Base |
上面的例子可以看到,我們沒辦法建立 Book 的紀錄。
options
required
: 如果設為true
的話,會驗證關聯是否存在。在 rails 5 預設為true
。optional
: 如果設為true
的話,不會驗證關聯是否存在。
上面兩個選項都是驗證關聯本身,不是驗證 foreign key 的 id。
Ruby on Rails 探索 inverse_of
inverse_of
主要功能會去通知對方自己的狀態,可以解決物件不同步的問題。
在 belongs_to 裡的 :inverse_of 會去找尋所對應的 has_one has_many 上相同的名稱,來通知他們之間的關係。
在 has_one has_many 裡的 :inverse_of 會去找尋所對應的 belongs_to 上相同的名稱,來通知他們之間的關係。
如果沒有寫 :inverse_of 這參數,rails 會使用 heuristic algorithm 去猜測名稱,但在如果不是使用標準名稱的話會失效。
Without inverse_of
沒有 :inverse_of 會發生物件不同步的問題,可以看以下的範例:
1 | class Author < ActiveRecord::Base |
Ruby on Rails Multiple Foreign Keys
這篇主要是在講說,在一個 Table 裡面有多個 Foreign Keys 會指向同一個 table。例子如下,一首歌 Song 會有歌手 (singer_id) 跟作曲者 (composer_id),都會指向同一個 Singer 的 table。
1 | ┌──────────────────┐ ┌─────────────────────┐ |
Ruby 直接儲存 Tempfile 的方法
先建立一個 Tempfile,然後隨便輸入一些資料進去。
1 | require 'tempfile' |
Tempfile 在程式結束的時候會 f.unlink
刪除檔案,所以在結束之前可以使用 File.rename
移動檔案,讓檔案逃脫免於被刪除的命運。
1 | # File.rename("afile", "afile.bak") |
Ruby on Rails Eager Loading 加速:一次拿取所以資料
這個在 rails 裡面,資料有關聯的時候,會產生的一些效能上的問題,假設我們的例子如下:
1 | ┌──────────────────┐ ┌───────────────────┐ |
當我們在 books controllers 拿了一群東西,像是有 all 或是 where
1 | @books = Book.all |
常常接著又在 view 裡面使用 each 抓取了關聯的東西 author,這時 @books 不知道 author 的內容所以又必須呼叫一次 SQL 指令去拿資料,所以當資料量一大的時候,會產生效能上的問題。
1 | @books.each do |book| |