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