我有一个带有电影表的数据库,
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个不同的星球大战电影记录和3个不同的用户ID。
我正在寻找的是检查我的数据库中是否已存在电影的方法,如果只是这样,则只将用户ID添加到该电影记录的用户ID列。这样用户就可以分享电影记录了。
同样在删除时,用户不应删除整个记录,而应仅删除该影片记录的用户ID列中的用户ID。
我正在使用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
答案 0 :(得分: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
记录,用于将用户与电影相连接。
我没有回答你的问题,但我强烈建议你考虑我说的话。
您可以在此处详细了解关联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)。