Importing Data With Migrations

This is a premium course, which you can purchase below.

Buy Now

If you're trying to port existing data into Spina, Rails migrations might be your best choice. You can read records from an existing database, your existing CMS, a CSV or a JSON dump.


I'm not a huge fan of migrations as I like having control of my SQL bits, however they can be extremely useful for small operations like data imports.
To create my Courses resource and import the data in, I had to use the following migration:

class AddCoursesAndLessonsToSpina < ActiveRecord::Migration[7.1]
  def up
    res = Spina::Resource.create!(id: 1, name: "courses", label: "Courses")
    courses = Course.all
    courses.each do |course|
      page = Spina::Page.create!(
        title: course.name,
        slug: course.sku,
        resource_id: 1,
        view_template: "course",
        json_attributes:{
          en_content: [
            {name: "slug", content: course.sku, type: "Spina::Parts::Line"},
            {name: "body", content: course.description, type: "Spina::Parts::Text"},
            {name: "summary", content: course.summary, type: "Spina::Parts::Line"},
          ]
        }
      )
      course.lessons.each do |lesson|
        Spina::Page.create!(
          title: lesson.title,
          slug: lesson.slug,
          ancestry: page.id,
          resource_id: 1,
          view_template: "lesson",
          json_attributes:{
            en_content: [
              {name: "slug", content: lesson.slug, type: "Spina::Parts::Line"},
              {name: "vimeo", content: lesson.vimeo_id, type: "Spina::Parts::Line"},
              {name: "summary", content: lesson.summary, type: "Spina::Parts::Line"},
              {name: "body", content: lesson.description, type: "Spina::Parts::Text"},
            ]
          }
        )
      end
    end
  end

  def down
    Spina::Page.where(resource_id: 1).destroy_all
    Spina::Resource.where(id: 1).destroy_all
  end
end