代码之家  ›  专栏  ›  技术社区  ›  Zergling

带有外键的种子数据库-种子。rb型

  •  0
  • Zergling  · 技术社区  · 8 年前

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

    这是我的种子。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 回复  |  直到 8 年前
        1
  •  0
  •   moveson Andrey Deineko    8 年前

    我可以看到两个问题:

    1. Movie.create ,您需要删除方括号。那是因为ActiveRecord create

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

    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 响应。