我正在使用Twitter gem来填充有关推文的一些数据。我设置了以下验证validates :link, uniqueness: true
,这会导致我的脚本在遇到模型中已存在的推文时停止。
这是我的模特:
class Twit < ApplicationRecord
validates :link, uniqueness: true
def self.get_tweets user
all_tweets = CLIENT.user_timeline(user, count: "30", exclude_replies: true, include_rts: false)
all_tweets.each do |tweet|
Twit.create!(content: "#{tweet.text}", link: "#{tweet.uri}", like: "#{tweet.favorite_count}", retweet: "#{tweet.retweet_count}", first_date: "#{tweet.created_at}")
end
end
end
我希望我的脚本能够在我的模型中继续创建新的推文。
谢谢!
答案 0 :(得分:0)
use `find_or_create_by` instead of create like
Twit.find_or_create_by(content: "#{tweet.text}") do |twit|
twit.link = 'xxxxx'
end
答案 1 :(得分:0)
使用
def self.get_tweets user
all_tweets = CLIENT.user_timeline(user, count: "30", exclude_replies: true, include_rts: false)
all_tweets.each do |tweet|
Twit.where(
content: "#{tweet.text}",
link: "#{tweet.uri}",
like: "#{tweet.favorite_count}",
retweet: "#{tweet.retweet_count}",
first_date: "#{tweet.created_at}"
).first_or_create!
end
end
希望这会对你有帮助!
答案 2 :(得分:0)
如果你只是不想保存已经在数据库中的推文,你可以删除!
,然后它不会引发错误,但它不会存储更改相似的值和转发价值。
Twit.create(content: "#{tweet.text}", link: "#{tweet.uri}", like: "#{tweet.favorite_count}", retweet: "#{tweet.retweet_count}", first_date: "#{tweet.created_at}")
另一种方法是使用find_or_create_by
来测试链接是否已存在于数据库中。
通过这种方式,您将编辑数据库中已有的记录,并使用新的金额和转发金额更新推文。
all_tweets.each do |tweet|
twit = Twit.find_or_create_by(link: tweet.uri)
twit.content = tweet.text
twit.like = tweet.favorite_count
twit.retweet = tweet.retweet_count
twit.first_date = tweet.created_at
twit.save
end