如何避免多个用户创建多个记录?

彼得·布姆斯玛

我有一个包含3个表的数据库。一个名为movie的表,具有2个值,我从themoviedb.org获得的唯一ID和标题。我还有一个名为users的表,该表具有名称值。我的第三个表是一个名为movies_users的联接表,看起来像这样,

class AddMoviesUsersJoinTable < ActiveRecord::Migration
  def self.up
    create_table :movies_users, :id => false do |t|
      t.integer :movie_id
      t.integer :user_id
    end
  end

  def self.down
    drop_table :movies_users
  end
end

在我的movie.rb模型中

has_and_belongs_to_many: users

在我的users.rb模型中

has_and_belongs_to_many: movies

我的movies_controller.rb中的创建动作看起来像这样,

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

用户可以执行搜索操作,我将为他们提供从themoviedb.org获得的结果列表。Themoviedb还为他们的电影提供唯一的ID。

现在,当多个用户添加同一部电影时,我会获得它的多个记录。例如,我添加了带有两个帐户的电影《信条》,这就是我的Rails控制台显示的内容,

Movie id: 1, title: "Creed",user_id: 1, movie_id: "312221">
Movie id: 2, title: "Creed",user_id: 2, movie_id: "312221">

如何在1部电影和多个用户之间建立关系?

理查德·派克(Richard Peck)

如何在1部电影和多个用户之间建立关系?

做这个:

#app/controllers/movies_controller.rb
class MoviesController < ApplicationController
   def create
      @movie = Movie.find_or_create_by movie_params
      current_user.movies << @movie
   end

   def destroy
      @movie = Movie.find params[:id]
      current_user.movies.destroy @movie #-> only destroys association, not actual object
   end

   private

   def movie_params
      params.require(:movie).permit(:title, :movie_id)
   end
end

如果一个@movieMovie记录不存在,它将填充一个新记录,如果存在则拉相关记录。这将允许您将哈希添加@moviecurrent_user.movies哈希-此处描述的方法

在此处输入图片说明

--

顺便说一句,您还需要注意其他事项。

您目前使用user_id在你Movie的模型。这将暗示一种belongs_to/has_many关系-与您的模型相反。

如果只想has_and_belongs_to_many在模型中使用,则需要user_idmovies表中删除外键-不需要它。


更新

$ rails c

$ user1 = User.find(1)
$ user1.movies #-> will output movies

$ user2 = User.find(2)
$ user2.movies #-> will output movies 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章