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

时间:2015-11-14 09:52:29

标签: ruby-on-rails

我有一个包含3个表的数据库。一个名为movies的表,它有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

在我的movies.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还为他们的电影提供了一个独特的身份证。

现在,当多个用户添加同一部电影时,我会获得多条记录。例如,我已经为电影Creed添加了两个帐户,这就是我的rails控制台显示的内容,

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

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

1 个答案:

答案 0 :(得分:1)

  

如何在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

如果一条记录不存在,这将填充@movie一条新的Movie记录,如果有,则提取相关记录。这样您就可以将@movie添加到current_user.movies哈希 - 描述的方法为here

enter image description here

-

顺便说一下,还有一些你需要注意的事情。

您目前在user_id模型中使用Movie。这表明belongs_to/has_many关系 - 与您的模型相反。

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

<强>更新

$ rails c

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

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