种子数据库与外键 - seeds.rb

时间:2017-10-04 20:32:54

标签: ruby-on-rails ruby foreign-keys seeding faker

我试图用Faker gem为数据库播种,当我尝试播放电影时我取得了成功,但是当我尝试播放每部有1-10条评论的电影时,我得到了一堆不同的错误取决于我的改变。

以下是我的seeds.rb的样子:

require 'faker'

formats = %w[Beta VHS IMAX HD SuperHD 4K DVD BluRay]
genres = %w[Triller Comedy Horror Action Drama SciFi Documentary]
images = %w[magento.svg mysql.svg php.svg jquery.svg mongodb.svg prestashop.svg meteor.svg]

Movie.destroy_all
Comment.destroy_all

100.times do
  movie = Movie.create([{ name: Faker::Book.title,
                          director: Faker::Name.name,
                          description: Faker::FamilyGuy.quote,
                          year: rand(1920..2018),
                          length: rand(80..240),
                          format: formats[rand(formats.length)],
                          genre: genres[rand(genres.length)],
                          image: images[rand(images.length)],
                          thumbnail: images[rand(images.length)] }])
  unless movie.nil?
    rand(1..10).times do
      movie.comments.create(
        author: Faker::Name.name,
        title: Faker::Book.title,
        content: Faker::FamilyGuy.quote,
        rating: rand(1..5)
      )
    end
  end
  puts movie.inspect
end

这是我的评论模型:

class Comment < ApplicationRecord
  belongs_to :movie
end

这是我的电影模特:

class Movie < ApplicationRecord
  has_many :comments

  validates_presence_of :name, :director
#  validates_numericality_of :year, :length, greater_than: 0
  validates_uniqueness_of :name, message: 'Name is already used!'
#  validates_length_of :year, maximum: 4

  paginates_per 10

  def proper_name
    name.titleize
  end

end

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我可以看到两个问题:

  1. Movie.create中,您需要删除方括号。那是因为ActiveRecord create方法需要哈希,而不是数组。当你在它的时候,你也可以删除花括号,你的参数仍然会被识别为哈希。

  2. 检查movie是否为nil不是正确的测试,因为movie将始终存在,即使它未保存到数据库中。将测试从unless movie.nil?更改为if movie.persisted?这样可以避免因为尝试将评论保存到未保存到数据库的电影而导致的错误。

  3. 所以你的代码应该是这样的:

    100.times do
      movie = Movie.create(name: Faker::Book.title,
                           director: Faker::Name.name,
                           description: Faker::FamilyGuy.quote,
                           year: rand(1920..2018),
                           length: rand(80..240),
                           format: formats[rand(formats.length)],
                           genre: genres[rand(genres.length)],
                           image: images[rand(images.length)],
                           thumbnail: images[rand(images.length)])
      if movie.persisted?
        rand(1..10).times do
          movie.comments.create(
              author: Faker::Name.name,
              title: Faker::Book.title,
              content: Faker::FamilyGuy.quote,
              rating: rand(1..5)
          )
        end
      end
      puts movie.inspect
    end
    

    为什么有些电影没有保存?我怀疑你的电影片名用完了,然后你的唯一性限制就失败了。 Faker对任何类别的回复都是有限的。我认为只有22个独特的Faker::Book.title回复。