如何使用Rails创建复杂的唯一?

时间:2013-11-21 16:17:32

标签: ruby-on-rails ruby-on-rails-3

我必须创建一个包含在Rails模型中唯一的http链接的字段。除此之外,我还想拒绝链接变体,如:

  • 如果我在http地址存在时尝试插入http S 地址
  • 当我有另一个没有参数或不同的链接时,我尝试插入带参数的链接

我发现此链接可能表明我的问题的答案,但我希望我可以直接在索引中执行此操作,因为我的情况不会随着时间的推移而改变。

In Rails, How do I validates_uniqueness_of :field with a scope of last 6 months

由于我对正则表达有一些经验,因此无需提供确切的答案。一个不同的例子或参考已经很精彩,因为我找不到任何

2 个答案:

答案 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检查机制

相关问题