У меня есть база данных с таблицей фильмов в ней,
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
Если вы используете реляционную БД, такую как 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) будет создана автоматически.