Image by WilliamsCreativity from Pixabay

AWS S3(AWS Simple Storage Service) has become a popular cloud service for people to store objects like files or images. It is more likely that we need to implement a function as accessing files from AWS S3 or uploading files to AWS S3 in our application. Recently, I also encounter a need to read a bunch of .xlsx files stored in AWS S3 in my Rails application, and I just want to read the content, so it is not a good idea to save all the files in our application forever. After trying some solution, I found Fog-AWS Gem and…


When it comes to testing for Ruby on Rails project, RSpec must be the most common tool that people would implement. By using RSpec, we could easily write a good testing script for our Rails project and test our project thoroughly. But after Rails 6 integrates Webpacker in the project as default, there are more chances that we would implement Javascript frameworks in the Rails project, and RSpec might no longer enough for us to test our Rails project thoroughly including testing those Javascript functions, so is that a good way for us to test those Javascript functions and scripts…


When selecting record from model in rails, if no specific setting, Rails will directly use the plurals of model name as the table name to do SQL query. For example, We select the last record in City model, and Rails will use cities as table name to do SQL query in database.

class City < ApplicationRecord
end
City.last
City Load SELECT `cities`.* FROM `cities` ORDER BY `cities`.`id` DESC LIMIT 1

If we want to load specific table when calling the model, we could clarify the table name in model. For example, if we want to load table tw_cities when select…


Sometimes we need to deploy our rails application to different stages(staging or production environment)which probably are remote machines, and we may need to do the deployment frequently, for each time the application has new version we would need to update the code to all stages environment. To save our time from manually doing repeated work in each time doing deployment, we could using Capistrano.

What is Capistrano?

Capistrano is a framework written in Ruby that provides automated deploy scripts. It supports the scripting and execution of arbitrary tasks, and includes a set of sane-default deployment workflows. …


Sometimes we might need to order records by their attribute value. If using Ruby on Rails Active Record, we could apply Active Record Query Methods: order to order model records by some of their attribute value. For example, if we have a product order model in our shopping website Ruby on Rails project and the model data is like the below table, when those data need to sort by the shipment mode value, we could simply use the order method to achieve that.


本篇文章包含四個部分:ActiveRecord::Enum說明及使用、human_attribute_name說明及使用、製作易讀的下拉選單、創建model共用模組印出選單選項,以下為詳細內容。

ActiveRecord::Enum說明及使用

在開發各式各樣的網站時,常會遇到要實作下拉選單功能,如果下拉選單的選項不少,又需要存到資料庫表單中,為了方便,通常會設計各個選項用數字儲存,例如電商網站儲存訂單狀態,各種狀態可能就會用不同的整數存進訂單資料表的欄位,像下方這樣

直接在rails console任意撈取一筆訂單資料看看,查詢status,結果會像下面這樣


之前文章有介紹過如何使用Google Map API(Geocoding API, Distance Matrix Service)去取得點位縣市鄉鎮資訊或是兩點之間的距離及移動所需時間資訊(有興趣可以看這兩篇: Geocoding API, Distance Matrix Service),這邊接著要介紹如何運用Google Map API取得兩點之間移動的最佳路徑資訊,並且把路徑顯示在地圖上,強大的Google Map目前提供了Google Map Javascript API :Directions Service讓我們可以獲取兩點之間的最佳路徑資訊,以下會依序說明如何使用Directions Service以及如何將結果繪製在地圖上。

基本設定

首先,跟使用其他的Google Map Java …


有在使用Google map的人想必很常會用來預先參考要去的地方大概要花多久時間到達,或是尋找自己鄰近的餐廳或咖啡廳等等,Google map提供的搜尋最短路徑或是旅程預估等功能,真的超級好用,Google也提供了這些功能的API — Google Map Javascript API : Distance Matrix Service,只要利用Distance Matrix Service,就可以簡單地得到地點之間移動所需的旅程時間及距離,以下就簡單的說明Distance Matrix Service的使用。

首先,要使用Google Map Javascript API的服務必須先申請Google Map的API key,詳細流程可以點進去API key這個連結去查看,主要的申請方式其 …


現在多數的網站,基本上都會建置搜尋的功能,以供給使用者更友善的操作介面,尤其像後台管理系統網站,為了提供管理者可以快速找出要查看的會員資訊,會員搜尋功能幾乎已經是基本配備,而且考量使用者操作的友善度,搜尋功能有時已經不能只是依輸入字串去找出完全相符的資料了,甚至需找出所有包含輸入字串的相關資料呈現給使用者,或者須提供使用者輸入多個字串去找出相關的資料,例如搜尋會員時,管理者可能會需要輸入多個關鍵字,去找出帳號包含這些關鍵字的會員,進一步的去查看這些會員的基本資訊,以下就依上述提到的多關鍵字搜尋會員這個案例,來說明可以如何實作。

運用sql語法查詢

首先,如果已經有一個User 的model,而且model有一個account欄位來紀錄每個user的帳號資訊,我們可以直接用下面的query來找出特定的帳號

User.where(account: 'admin')

但是這樣我們只能找出帳號完全符合 admin 這個字串的會員資料,所以這個時候可以搭配使用到sql的語法LIKE來找到所有帳號包含 admin 的會員資料

User.where('users.account LIKE ?', '%admin%')

除了LIKE,也可以使用RLIKE達到一樣的效果

User.where('users.account RLIKE ?', 'admin')

不過要注意就是,使用LIKE,搜尋的關鍵字串前後要加上%,才會表示前後可以有多個字符,而RLIKE是正規表達式,搜尋的關鍵字串就不用在前後特別加%。

若想搜尋帳號符合多個關鍵字,例如同時找出帳號包含 admin 或包含 test的會員,可以這樣使用LIKE語法,達到想要的結果

User.where('users.account LIKE ? OR users.account LIKE ?','%admin%',              '%test%')

使用RLIKE的話,語法則會像下面這樣

User.where('users.account RLIKE ?', 'admin|test')

比較上面這兩種方式,其實就可以看出,RLIKE將LIKE查詢多關鍵字的語法簡化的不少,所以採用RLIKE來實現多關鍵字查詢時,查詢語法是比較簡潔的,可以優先考慮使用。

包成model的scope方便使用

上面已經討論了如何搭配sql語法搜尋帳號,這些查詢的語法,可以包成User model的scope來方便呼叫,這樣如果一個網站有好幾個地方要下搜尋帳號的語法時,就不用每次都寫一大串程式出來,只要呼叫User的scope即可,例如只要在User model加入以下程式碼

scope :find_account, ->(accounts) {
sql = 'users.account RLIKE ?'
where(sql, accounts)
}

就可以直接像這樣查詢帳號

User.find_account('admin|test')

這樣查詢的程式碼很簡潔也很方便,但是缺點就是傳入的字串是要長得像 ’admin|test’ 這種形式才行,但是使用者在搜尋框輸入關鍵字的時候,可不知道要讓多個關鍵字打成這樣才行,一般人可能就用逗號分隔關鍵字( admin, test ),或是逗號後面再加個空格( admin, test ),所以find_account這個scope可以再加一些東西處理傳入的字串,像下面這樣

scope :find_account, ->(accounts) {
accounts.delete!(' ')
accounts.gsub!(',', '|') || account
sql = 'users.account RLIKE ?'
where(sql, accounts)
}

這樣查詢帳號的時候,就可像這樣使用find_account了

User.find_account('admin, test')

使用者可以直覺得用逗號分隔要查詢的關鍵字

如果光是查詢使用者帳號有包含這些關鍵字的會員已經無法滿足需求,還要再加上一併查詢使用者姓名也包含這些關鍵字的會員,這時就可以很輕鬆的在find_account這個scope再加上一些條件

scope :find_account, ->(accounts) {
accounts.delete!(' ')
accounts.gsub!(',', '|') || accounts
sql = 'users.account RLIKE ? OR '\
'users.name RLIKE ?'
where(sql, accounts, accounts)
}

這樣查詢結果就會包含搜尋會員姓名所得到的結果了

以上使用sql語法並包成model scope的方式,再搭配html表單及controller操作scope,就可以做出很不錯的多關鍵字查詢功能,像下面這樣


表單基本作法

在建置網站的時候,我們時常需要在網頁上製作表單(form)頁面來新增、更新或是用來查詢在資料庫中的資料,例如用來新增或更新使用者資訊,這時候就會需要用到一個表格來填寫使用者的一些基本資訊,例如帳號、密碼或是帳號類型等等,大概會長得像下面這樣

icelandcheng

Programming Skill learner and Sharer | Ruby on Rails 💎 Vue.js 🌐Web Map API

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store