ancestry vs awesome_nested_set - Rails 樹狀結構比較
在 Rails 中處理樹狀結構有一些套件可用,本篇文章將比較下面幾種解決方案: ancestry awesome_nested_set closure_tree 情境假設有個 model:Node,可以樹狀加入子節點。 功能ancestry設定使用新的規則,config/initializers/ancestry.rb 加入 1Ancestry.default_ancestry_format = :materialized_path2 需要使用樹狀結構的資料表要增加一些專用欄位 1234567891011121314create_table :nodes do |t| t.string :name, null: false # 必要欄位 t.string :ancestry, collation: 'C', null: false # 擴充功能 t.integer :ancestry_depth, default: 0 t.integer :children_count, default: 0 t.timestamps t. ...
acts-as-taggable-on vs. PostgreSQL Array (acts-as-taggable-array-on)
acts-as-taggable-on 是 Rails 中處理標籤功能的常用套件,而利用 PostgreSQL 特殊的 Array 型別也能實現類似的功能,像是 acts-as-taggable-array-on 套件就是以 PostgreSQL Array 實現。本篇文章將比較下面幾種解決方案: acts-as-taggable-on acts-as-taggable-array-on pg_taggable 情境假設有兩個 model:Post 和 User,Post 有 tags 屬性,並屬於某 User。可能常見的功能: 依照 tags 來搜索 Post。 取得某個 User 的 tags。 統計某個 User 的 tags 次數。(標籤雲) 功能acts-as-taggable-on設定acts-as-taggable-on 用另外兩張表來儲存標籤,一次性建好資料表,之後只要在 model 中設定就好: 12345class Post < ApplicationRecord belongs_to :user acts_as_taggable_on :tags ...
jbuilder vs active_model_serializers vs oj_serializers - Rails JSON API 解決方案選擇
Rails 產生 JSON 有內建的 as_json 可以使用之外,對於 JSON API 處理也有預設安裝的 jbuilder 套件,也有其他不同套件可以選擇。本篇文章將比較下面幾種解決方案: as_json jbuilder active_model_serializers oj_serializers 依據個人的經驗考慮以下需求: 容易整理維護。 定義好的結構能夠方便重用。 要能在程式中產生 JSON 物件使用。 效能。 方便測試。 情境假設有兩個 model:Post 和 User。想要分別產生下面的 JSON 結果: Post index 12345678910111213{ "posts": [ { "id": 1, "title": "Post Title", "timeago": "19 minutes", "user": { &qu ...
Rails + Passenger 解決 Request queue full (configured max. size: 100)
問題透過 Passenger 的相關 HTTP Request 回應 503,出現下面錯誤訊息 1Request queue full (configured max. size: 100) 原因Passenger 使用多個程序 (Process) 來處理 HTTP 請求,預設為 6 個。當大量 Request 進來時,處理不及的會先放在 Queue 等待處理,預設 100 個,當超過 Queue 的上限時會出現這錯誤。 處理請求速度不夠,來不及消化是出現錯誤的原因,然而處理速度不夠的原因就有很多可能,而對應的解決方式也都不同。這邊列出幾個我想得到的原因: 設定問題 程式效能問題 大量 HTTP 請求 程式存在 Bug 底層框架或套件有 Bug 網路上可能會看到有人說去修改 passenger_max_request_queue_size 的設定,來增加 Queue 的大小,但這沒有根本解決問題,還是要找出原因來對做應處理。 設定問題說明比較常見的是 Passenger 使用 ActionCable 時設定沒有正確。ActionCable 使用 Socket 持續連線,所以會常時 ...
Rails ActionCable 效能測試
本篇文章說明連線數上限相關設定,以及實測 ActionCable 預設模式、Standalone 模式和 AnyCable 三種方案的效能比較。 準備首先建立一個 Rails 專案來測試 ActionCable 連線效能,先寫一個簡單的 Channel 12345class MessageChannel < ApplicationCable::Channel def subscribed stream_for 'message_channel' endend 在 config/environments/development.rb 加上 1config.action_cable.disable_request_forgery_protection = true 然後寫一個 Node Client 程式來測試,使用套件 @anycable/web 和 ws 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849imp ...
利用 binstubs 省略 bundle exec
bundle binstubs在 Ruby 中我們可以使用 Bundler 來管理專案的套件和版本,為了確保執行 rake 等指令時,能使用 Gemfile 一致的設定,我們通常會使用 bundle exec 作為開頭來執行指令,例如: 1bundle exec rake db:migrate 不過每次都要打 bundle exec 顯得有些麻煩,這時候我們可以利用 bundle 的 binstubs 來解決這問題。 例如我們想產生 rake 的 binstubs,輸入 1bundle binstubs rake 會在專案下的 bin 資料夾產生 rake 的 script,這時候執行 1./bin/rake 就相當於 1bundle exec rake 如果想產生全部 binstubs,可以執行 1bundle install --binstubs 不過不建議這樣做,他會在該目錄下產生 .bundler 的設定值,之後只要執行 bundle install 都會重新產生 binstubs,如果有使用 spring 之類的套件會被覆蓋掉。 環境變數產生了 binstubs 之後 ...
Ruby 教學 - 陣列 (Array)
語法一般陣列Ruby 中使用中括號 ([]) 來建立陣列,括號中為陣列元素,以逗點 (,) 隔開: 1p [178, 169.99, "30cm", [9527]] # [178, 169.99, "30cm", [9527]] 陣列中的元素也可以是陣列,而成為多維陣列的應用。 字串陣列Ruby 中另外提供了使用百分比符號 (%) 開頭,加上任意的符號 (非字母數字) 包夾字串陣列元素,以空白隔開,有以下兩種方式: %w{xx oo},不解析內容 %W{xx oo},解析內容 規則和單引號雙引號類似,所有的元素都會是字串型別,如下範例: 1234var = 5566p %w{178 169.99 "30cm" [9527] %w{9527} #{var}} # ["178", "169.99", "\"30cm\"", "[9527] ...
Ruby 教學 - 符號 (Symbol)
語法符號類似一種無法修改的字串,使用冒號 (:) 開頭,有以下三種使用方式: 冒號加名稱,:symbol 冒號加單引號字串,:'symbol' 冒號加雙引號字串,:"symbol" 如下範例: 123p :symbol1 # :symbol1p :"symbol2" # :symbol2p :'symbol3' # :symbol3 程式解析當使用字串形式的時候,也具有和字串一樣程式解析的性質,同樣的是雙引號的時候才有: 1234var = "value"p :"#{var}" # :valuep :'#{var}' # :"\#{var}" 不過一般而言,使用 symbol 通常是固定值,所以這種動態的用法不常使用。 符號的操作符號是無法修改的,但有也部分類似字串的方法: 123456symbol = :"I lose"puts sy ...
Ruby 教學 - 字串 (String)
語法字串有四種使用方式: 單引號 雙引號 Heredoc 百分比符號 (%) 以下逐一進行介紹 單引號以兩個單引號包夾一段文字,表示字串內容,使用單引號的字串有一些特徵如下 (與雙引號比較): 逸出字元 (Escape characters) 只有兩種。 逸出字元 \\ 可省略寫作 \,但不可為最後一個字元 (不建議省略)。 不會對字串中的程式進行解析。 所謂逸出字元是為了某些特別的用途或能以此輸入打不出來的字,而定義的一種使用方式,在此的逸出字元以反斜線 (backslash) 開頭。例如,我們使用單引號做包夾,但字串中如果出現單引號,將會誤判為字串結束單引號,所以使用 \' 來表示字串中的單引號。使用單引號的字串可用的逸出字元如下: 符號 說明 ' 單引號字元。 \ 反斜線字元。 一些使用範例如下: 123456789101112puts '基本用法';puts '也可以斷行';puts 'You\'re a good man.'; # You'r ...
Ruby 教學 - 數字 (Numeric)
語法Ruby 的數字型別許多衍生的類別,本文將針對整數和浮點數介紹。從整數的角度來看,它可以用以下四種寫法: 十進位制。 十六進位制,0x 開頭。 八進位制,0 開頭。 二進位制,0b 開頭。 例如: 1234puts 100 # 100puts 0x100 # 256puts 0100 # 64puts 0b100 # 4 浮點數的部分則必須寫出小數點或科學記號表示: 1234567puts 1.23 # 1.23puts 12e3 # 12000.0puts 12E-3 # 0.012puts 1.0 / 3 # 0.3333333333333333puts 1 / 3 # 0, 特別注意puts 10 / 3 * 1.1 # 3.3000000000000003puts 10.0 / 3 * 1.1 # 3.666666666666667 尤其要注意的是除法的部分,如果前面的數字是整數,結果可能不如預期。 數值的範圍整數的部分會自動轉換成大數型別,所以理論上是正負無窮大,浮點數的部分則介於 2.225073858507201 ...

