2013-10-28 20 views
0

我正在使用Ruby on Rails。我想將用戶名存儲到數據庫中,當我提取它們時,我希望它們具有與輸入時相同的大小寫,但我想添加一些不區分大小寫的驗證,以確保無法使用相同的用戶名,無論大寫。我如何將用戶名保存在數據庫中並保持大小寫,同時進行不區分大小寫的驗證?

我這樣說是因爲不是所有的數據庫適配器都使用區分大小寫的索引,所以我需要在用戶名保存到數據庫之前將用戶名縮寫。

因此在模型驗證會是這樣:

uniqueness: { case_sensitive: false } 

我怎麼會去這樣做呢?

回答

-1

您提到的驗證(uniqueness: { case_sensitive: false })不會在用戶名存儲時更改用戶名的情況,而只會檢查是否存在相同的電子郵件。實質上,根據您目前的驗證,您不必擔心這個問題。

+0

但是,不是所有的數據庫適配器都使用區分大小寫的索引,所以我需要做驗證然後'before_save {username.downcase! }' – Tim

+0

@Tim您使用的是哪種數據庫適配器,還是您希望此應用程序可以跨多種類型的數據庫工作? – jvperrin

+0

用於開發和測試的SQLite3和用於生產的PostgreSQL。 – Tim

1

想到了一些方法。

容易

你可以有一個區分大小寫的模型級驗證,因爲你正在做的和在數據庫中根本不驗證獨特性。

醜陋

或者,如果你堅持一個數據庫級別的驗證,髒數據庫無關的方式做到這一點可能是有另一個領域,只是用於驗證。

add_column :users, :uppercase_username, :string, unique: true 

class User 
    def username= 
    @username = value 
    uppercase_username = value.upper 
    end 
end 

真棒

您可以定義自己的indexing function(可能是數據庫特定的)。

+0

「簡單」選項有漏洞。 「醜陋」選項(對'uppercase_username'具有數據庫內唯一性約束)是便攜式方法。 「awesome」是數據庫特定的,會混淆Rails,除非你從'schema.rb'切換到'structure.sql',因爲'schema.rb'沒有辦法存儲特定於數據庫的索引。 –

+0

我認爲'醜陋'的選擇是'真棒'一個 – fengd

+1

我想我很久以前放棄了「數據庫可移植性」,並且很高興嫁給了postgres和structure.sql – mkirk

相關問題