如何在ruby on rails上避免数据库中的重复数据

时间:2017-07-24 09:28:13

标签: ruby-on-rails ruby postgresql

我从其他网站废弃了数据并将其保存在我的数据库中,该数据库工作正常。但是,无论何时刷新我的应用程序,报废的数据都会在我的数据库中复制。任何帮助都将受到高度赞赏。以下是我的代码

require 'open-uri'
require 'nokogiri'
doc = Nokogiri::HTML(open("www.example.com"))
entries = doc.css('.block')
@entriesArray = []
entries.each do |row|
    Scrap.create!(                  
    title: title = row.css('h2>a').text,
    link:  link = row.css('a')[0]['href'],
    day:   days =row.css('time').text)
    @entriesArray << Entry.new(title,link,days)
end

3 个答案:

答案 0 :(得分:0)

您应该在数据库上添加uniq索引,例如,link列(这是为了优化find_by并强制您使用相同的链接没有重复项,它&#39不需要,虽然它是有道理的),因为它们是独一无二的(你也可以带着标题,但它们可以重复自己? - 不确定,这取决于你取得的东西)

然后检查数据库中是否已经有link,如下所示:

entries.each do |row|
        scrap = Scrap.create_with(title: row.css('h2>a').text, day: row.css('time').text).find_or_initialize_by(link: row.css('a')[0]['href'])
        @entriesArray << Entry.new(title,link,days) if scrap.new_record? && (scrap.save! if scrap.new_record?)
    end

(最后if以防您只想添加Entry如果它是新Entry,如果您想要添加它,无论如何,只需删除从if scrap.new_record? ...end

答案 1 :(得分:0)

您想为Scrap模型添加唯一性验证器,如下所示:

validates :title, uniqueness: true 
validates :link, uniqueness: true

这样可以防止同一记录被保存两次。

答案 2 :(得分:0)

如果任何验证失败,您可以使用model验证来引发create!上的错误。

class Scrap < ApplicationRecord
    validates_uniqueness_of :title
end

并且,只有在数据库中不存在时,您还可以使用first_or_create方法创建新记录:

entries.each do |row|
    title = row.css('h2>a').text
    link = row.css('a')[0]['href']
    day = row.css('time').text

    Scrap.where(title: title).first_or_create(                  
      title: title,
      link: link,
      day: day
    )
    @entriesArray << Entry.new(title,link,days)
end