将多个用户ID添加到一条记录中

时间:2015-11-10 20:17:00

标签: ruby-on-rails angularjs

我有一个带有电影表的数据库,

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

1 个答案:

答案 0 :(得分:1)

如果您使用关系数据库,例如PostgreSQL或MySQL,在您的情况下,最好有3个表:moviesusers,第三个用于存储之间的链接电影和用户。这种类型的关联称为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)。