我必须创建一个包含在Rails模型中唯一的http链接的字段。除此之外,我还想拒绝链接变体,如:
我发现此链接可能表明我的问题的答案,但我希望我可以直接在索引中执行此操作,因为我的情况不会随着时间的推移而改变。
In Rails, How do I validates_uniqueness_of :field with a scope of last 6 months
由于我对正则表达有一些经验,因此无需提供确切的答案。一个不同的例子或参考已经很精彩,因为我找不到任何
答案 0 :(得分:2)
这样的事情可以为您提供第一步:
require 'uri'
class Link < ActiveRecord::Base
attr_accessor :link
validate :check_link_integrity
validates :url, uniqueness: true
before_save :parse_link
def check_link_integrity
begin
URI::parse(self[:link])
return true
rescue URI::InvalidURIError => e
return false
end
end
def parse_link
uri_link = URI::parse( self.attributes.delete(:link) )
self.url = uri_link.host + uri_link.path
self.protocol = uri_link.scheme
self.parameters = uri_link.query
end
def to_s
"#{protocol}://#{url}?#{parameters}"
end
end
URI模块文档:http://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html
答案 1 :(得分:1)
您可以使用URI模块
使用自定义验证方法你需要的只是 uri = URI(your_url) 然后基本上检查是否有另一条记录具有相同的uri.host和uri.path。
是的,这不是一种铁路方式,这需要对每次验证进行计算,但是您的请求也不简单。
另一种方法是在数据库中仅存储主机名+路径(意思是:在保存期间从URL切割协议和参数)。这样您就可以使用内置的uniqness检查机制