Добавить несколько идентификаторов пользователей в одну запись

0

У меня есть база данных с таблицей фильмов в ней,

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"
end

В тот момент, когда пользователь добавляет новый фильм в свой список наблюдения, создается новая запись, даже если этот фильм уже установлен в базе данных.

Так, например, 3 пользователя все добавляют новый фильм "Звездные войны" в свой список наблюдения, моя база данных будет иметь 3 разных записи этого фильма "Звездные войны" и с тремя разными идентификаторами пользователя.

Я ищу способ проверить, существует ли фильм в моей базе данных, если это так, только добавьте идентификатор пользователя в столбец идентификатора пользователя этой видеозаписи. Чтобы пользователи делились видеозаписью.

Также при удалении пользователи не должны удалять всю запись, а только свой идентификатор пользователя из столбца идентификатора пользователя этой видеозаписи.

Я использую Angular, поэтому это моя функция addMovie в моем контроллере,

    movieAdd.add()
      .then(function(response){
        $scope.movieListID = response;
        console.log ('Not empty' + $scope.movieListID)

        for (var i = 0; i < $scope.movieListID.releases.countries.length; i++) {
          var release = $scope.movieListID.releases.countries[i];
          if (release['iso_3166_1'] == 'NL') {
              releaseNL = release;
          }
        }

        if(typeof releaseNL === 'undefined'){
          // With release date

          Notification($scope.movieListID.original_title + ' is toegevoegd, maar heeft nog geen Nederlandse premiere datum.');

          createMovie.create({
            title:          $scope.movieListID.original_title,
            release_date:   $scope.movieListID.release_date,
            image:          $scope.movieListID.poster_path,
            movie_id:       $scope.movieListID.id
          }).then(init);

        } else {
          Notification.success($scope.movieListID.original_title + ' is toegevoegd.');

          createMovie.create({
            title:          $scope.movieListID.original_title,
            release_date:   releaseNL.release_date,
            image:          $scope.movieListID.poster_path,
            movie_id:       $scope.movieListID.id
          }).then(init);
        };

      })
      .catch(function(response) {
        console.log ('No search response')
      });

  }

И это контроллер RoR,

def create
  respond_with Movie.create(movie_params.merge(user_id: current_user.id))
end

1 ответ

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

Если вы используете реляционную БД, такую как PostgreSQL или MySQL, в вашем случае хорошая практика иметь 3 таблицы: movies, users а третья - для хранения ссылок между фильмами и пользователями. Этот тип ассоциации называется " many-to-many. Это устранит дублирование записей movies в БД.

create_table "movies" do |t|
  t.string   "title"
  ....
  # no user_id column
end

create_table "users" do |t|
  t.string   "name" # for example
  ...
end

create_table "movies_users" do |t|
  t.integer "user_id"
  t.integer "movie_id"
end

В этом случае, если пользователь хочет поделиться фильмом, movies_users одна запись movies_users которая соединяет пользователя с фильмом.

Я не ответил на ваш вопрос, но я настоятельно рекомендую вам подумать о том, что я сказал.

Вы можете узнать больше об ассоциациях здесь http://guides.rubyonrails.org/association_basics.html

Отредактировано (пример действия контроллера):

def create
   movie = Movie.create(movie_params)
   current_user.movies << movie
   ...
end

или вот так:

def create
   current_user.movies.create(movie_params)
   ...
end

В обоих случаях третья запись таблицы (movies_users) будет создана автоматически.

  • 0
    Я пытаюсь использовать этот метод, но у меня возникают проблемы при настройке контроллеров. Как бы вы поступили так?
  • 0
    Отредактировал ответ, добавил примеры контроллеров.

Ещё вопросы

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