2010-01-24 4 views
1

У меня есть поле URL по имени ссылка в моей модели с помощью следующей проверкиПодтверждает уникальность: ссылки

validates_uniqueness_of :link, :case_sensitive => false 

Когда я поставил «http://stackoverflow.com», он идет хорошо. Теперь, когда я положил «https://stackoverflow.com/» (с трейлинг-слалом), это также считается уникальным. Но я хочу, чтобы он был недействительным, хотя в конце есть «/»?

ответ

2

Я бы предположим, что вы нормализуете свои URL-адреса (добавьте/разделите косые черты и т. д. см. http://en.wikipedia.org/wiki/URL_normalization), прежде чем хранить их в БД и даже до проверки.

validates_uniqueness_of :link, :case_sensitive => false 
before_validation :normalize_urls 

def normalize_urls 
    self.link.strip! 
    self.link.gsub!(/\/$/,'') 
end 

Это не совсем то, что вы просили, но если вы не храните нормированные адреса, вы должны опрашивать БД для всех возможных вариаций в ходе проверки, и которые могли бы быстро получить дорого.

1

Вы всегда можете выполнить собственный валидатор (например, используя метод validate).

Это может выглядеть примерно так:

class MyModel < ActiveRecord::Base 
    validate :link_is_unique 

    def link_is_unique 
    #Clean up the current link (removing trailing slashes, etc) 
    link_to_validate = self.link.strip.gsub(/\/$/,'') 

    # Get the current count of objects having this link 
    count = MyModel.count(:conditions => ['link = ?', link_to_validate]) 

    # Add an error to the model if the count is not zero 
    errors.add_to_base("Link must be unique") unless count == 0 
    end 
end 

Затем можно добавить другую логику, чтобы очистить ссылку (т.е. проверить на HTTP: //, WWW и т.д.)

Смежные вопросы