2014-12-22 70 views
1

我有一個具有「名稱」和「領域」屬性的公會的模型 我希望使「名稱」和「領域」配對無論如何都是唯一的案件。強化區分大小寫是我在他們這一刻遇到的唯一問題。如何在不區分大小寫的情況下驗證唯一對

這裏就是我這麼遠:

validates_uniqueness_of :name, scope: :realm, case_sensitive: false 

的[CASE_SENSITIVE:假]部分作品,但只針對我目前使用的Rails 4.1.8第一個屬性(名稱)

,用於開發的SQLite和用於生產的PG 我非常感謝任何幫助。謝謝!

回答

1

這是我的理解,這不支持。 case_sensitive選項適用於正在驗證的列,範圍選項僅適用於同一個表中的列。

你可以嘗試使用PG的lower像這樣scope: "lower(realm)"但我懷疑試圖訪問列table_name.lower(realm)

你需要做的是更換驗證了自定義的時候,它會失敗。

class Model 
    validate :your_validator 

    private 

    def your_validator 
    if Model. 
     where("LOWER(name) = ? AND LOWER(realm) = ?", 
      name.downcase, realm.downcase). 
     exists? 
     # add errors here 
    end 
    end 
end 
+0

這可能是最直接的方法。我只想補充一點,作者應該重新評估是否真正需要的行爲是讓「不同大小寫的領域」彼此相等,而不是僅僅在保存之前使它們符合它們(例如,使之前的保存動作降低或提升領域價值)。在後一種情況下,您的原始代碼將起作用。 –

+0

我想過包含這個建議。但讀'行會'和'領域'讓我覺得這可能是一個與遊戲有關的項目。而在遊戲中,用戶通常會使用他們想要保留的奇怪的大小寫。 – Humza

+0

是的,在那種情況下,我肯定會用你的方法(我把它提高了)。 –

相關問題