Rails - 验证使我的数据库填充脚本停止

时间:2016-09-02 09:29:48

标签: ruby-on-rails validation model

我正在使用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

我希望我的脚本能够在我的模型中继续创建新的推文。

谢谢!

3 个答案:

答案 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