Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在RubyonRails中避免数据库中的重复数据_Ruby On Rails_Ruby_Postgresql - Fatal编程技术网

Ruby on rails 如何在RubyonRails中避免数据库中的重复数据

Ruby on rails 如何在RubyonRails中避免数据库中的重复数据,ruby-on-rails,ruby,postgresql,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| S

我已经从另一个网站上删除了一个数据,并将其保存在我的数据库中,该数据库工作正常。然而,每当我刷新我的应用程序时,废弃的数据就会在我的数据库中复制。任何帮助都将不胜感激。下面是我的代码

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
需要“打开uri”
需要“nokogiri”
doc=Nokogiri::HTML(打开(“www.example.com”))
条目=doc.css(“.block”)
@entriesArray=[]
条目。每个do |行|
废品,创造!(                  
title:title=row.css('h2>a')。文本,
link:link=row.css('a')[0]['href'],
day:days=row.css('time')。文本)

@entriesArray您应该在数据库的
链接
列上添加一个uniq索引(这是为了优化find_by,并强制执行,您不会有重复的链接,虽然这是有意义的),因为它们是唯一的(你也可以选择标题,但他们可以重复自己的内容?-不确定,这取决于你要拍什么)

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

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
entries.each do|行|
报废=报废。使用(标题:row.css('h2>a')。文本,日期:row.css('time')。文本)创建。\u。通过(链接:row.css('a')[0]['href'])查找或初始化\u

@entriesArray您希望向报废模型添加唯一性验证器,如下所示:

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

这将防止同一记录保存两次。

如果任何验证失败,您可以使用
模型
验证在
创建!
上引发错误

class Scrap < ApplicationRecord
    validates_uniqueness_of :title
end

您是否考虑过数据库中的唯一性验证和唯一索引?
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