Хранить несколько значений в базе данных

0

У меня есть две таблицы в моей базе данных SQLite. На столе назывались movies и таблица, называемая trailers. В таблице фильмов есть несколько столбцов,

create_table "movies", force: :cascade do |t|
  t.string   "title"
  t.string   "release_date"
  t.string   "image"
  t.integer  "user_id"
  t.datetime "created_at",   null: false
  t.datetime "updated_at",   null: false
  t.string   "movie_id"
  t.string   "imdb_rating"
end

Я хочу добавить трейлеры в свои фильмы. Я пробовал это, добавив столбец, называемый trailers в мою таблицу movies, а затем сохраните несколько результатов в 1 столбце. Но это не похоже на правильный путь.

Поэтому я создал таблицу trailers.

create_table "trailers", force: :cascade do |t|
  t.string   "movie_id"
  t.string   "link"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

Моя идея состояла в том, чтобы сохранить каждую ссылку трейлера с значением movie_id, чтобы я мог объединить две таблицы в 1 файл JSON, который я мог бы использовать в своем приложении Angular.

Чтобы получить данные трейлера, я создал службу,

service.trailer = function(youtube_link){
  return httpPromise(
    baseUrl + youtube_link + '/videos?api_key=a8f7039633f2065942***a28d7cadad4&callback=JSON_CALLBACK'
  )
};

Данные, возвращенные из этой службы, выглядят так:

{"id":157336,"results":[
  {"id":"53db3c790e0a26189a000d09","iso_639_1":"en","key":"ePbKGoIGAXY","name":"Trailer 3","site":"YouTube","size":1080,"type":"Trailer"},
  {"id":"550df44b9251413554004d43","iso_639_1":"en","key":"KlyknsTJk0w","name":"Own it today","site":"YouTube","size":720,"type":"Trailer"},
  {"id":"533ec6fcc3a3685448009ccc","iso_639_1":"en","key":"nyc6RJEEe0U","name":"Teaser","site":"YouTube","size":720,"type":"Trailer"},
  {"id":"5376ab510e0a26141c0005a8","iso_639_1":"en","key":"zSWdZVtXT7E","name":"Trailer","site":"YouTube","size":720,"type":"Trailer"},
  {"id":"545da247c3a3685362005187","iso_639_1":"en","key":"Lm8p5rlrSkY","name":"Trailer 2","site":"YouTube","size":1080,"type":"Trailer"}
]}

Поэтому теперь я пытаюсь сохранить данные в таблице trailer.

var mappedData = dataYoutube.results.map(function(r) {
  var obj = {}
  obj["movie_id"] = dataYoutube.id;
  obj["link"] = r.key
  return obj;
});
console.log(mappedData);

createTrailer.create({
  movie_id: mappedData.movie_id,
  link:     mappedData.key
})

И функция createTrailer в моем сервисе,

app.factory('createTrailer', ['$http', function($http){
  return{
    create: function(trailer){
      return $http.post('/trailers.json', trailer);
    }
  };
}])

На бэкэнде Rails я создал маршруты,

resources :trailers, only: [:create, :destroy, :index, :show]

A trailers_controller.rb

class TrailersController < ApplicationController
  def index
    respond_with Trailer.all
  end
  def create
  end
end

И trailer_model.rb

class Trailer < ActiveRecord::Base
  belongs_to :movie
end

В настоящее время, когда я делаю действие сохранения, я получаю сообщение об ошибке в моей консоли rails,

Started POST "/trailers.json" for 127.0.0.1 at 2015-12-04 16:04:25 +0100
Processing by TrailersController#create as JSON
  Parameters: {"movie_id"=>[{"movie_id"=>210577, "link"=>"Ym3LB0lOJ0o"}], "link"=>[{"movie_id"=>210577, "link"=>"Ym3LB0lOJ0o"}], "trailer"=>{"movie_id"=>[{"movie_id"=>210577, "link"=>"Ym3LB0lOJ0o"}], "link"=>[{"movie_id"=>210577, "link"=>"Ym3LB0lOJ0o"}]}}
  User Load (10.9ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
Completed 500 Internal Server Error in 15ms (ActiveRecord: 17.1ms)

ActionView::MissingTemplate (Missing template trailers/create, application/create with {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :haml, :jbuilder]}. Searched in:
  * "/home/alucardu/sites/movieseat/app/views"
  * "/home/alucardu/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/devise-3.5.2/app/views"
):
  • 0
    Ваш вопрос не ясен. Angular не работает с таблицами базы данных, и у вас есть несколько ключей для одного идентификатора.
  • 0
    Мне нужно использовать Angular для создания функции сохранения для базы данных.
Показать ещё 8 комментариев

1 ответ

1
Лучший ответ

Основываясь на ваших данных выше, вы можете создать массив объектов, каждый из которых имеет movie_id и link:

var mappedData = data.results.map(function(r) {
    var obj = {}
    obj["movie_id"] = data.id;
    obj["link"] = r.key

    return obj;
});

Скрипт: http://jsfiddle.net/muat8brp/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню