2016-06-15 9 views
0

一意性の2つのフィールドを検証する必要があります。私は個別に2つの別々の列にまたがる1つの属性の一意性を確認する

validates_uniqueness_of :name, scope: {:url, :original_url} 

それぞれを検証することができます。しかし、私は、私は両方のフィールドから守ることができますどのようにうまくいかないことができ

モデル

:name 
:original_url #(this cannot match any url or original_url) 
:url #(this cannot match any url or original_url) 

。私はパフォーマンスについても気にしています(テーブルに2mのレコードがあります)。フィールドは索引付けされているので、これで十分です。

これを行うにはどうすればよいでしょうか?

答えて

0

感謝を右のトラックに私を指しているため上記bkunziする名前を指定しdidntのため、私は「モデル」のコンテキストでこれをしておこう。

検証:ensure_urls_unique

def ensure_urls_unique 
    urls = [self.url, self.original_url].compact # To allow 'nil' to match 
    if Job.where("original_url IN (?) OR ad_url IN (?)",urls, urls).where(name:self.name).where.not(id:self.id).exists? 
    self.errors.add(:base, "The urls must be unique!") 
    else 
    return true 
    end 
end 

それは.existsことは注目に値しますか! .emptyよりも良いビットを実行しますか?大規模なサンプルセットやマッチする可能性が高い場所

0

これを行う最善の方法は、データベースレベルとRailsモデルの両方で行うことです。私は後者のお手伝いができますし、うまくいけば誰かがSQLを使ってこれをどのように追加するかについて話し合うことができます。あなたのmodel.rbファイルで

validate :ensure_unique_for_both_cols 

def ensure_unique_for_both_cols 
    if self.original_url || self.url 
    #Ensure no record matching this exists in either field 
    unless Model.where("original_url = ? OR url = ?",self.original_url, self.url).empty? 
     self.errors.add(:base, "The url must be unique!") 
    end 
    end  
end 
+0

これはうまくいきません。 original_urlがoriginal_urlsと一致するかどうか、またはurlが任意のURLと一致するかどうかをテストします。 original_urlがoriginal_urlまたはad_urlに一致するかどうか、また同様にurlに一致するかどうかを確認するテストが必要です。 – Carpela

関連する問題