创建 habtm 关系

Creating a habtm relationship

我正在 rails/angular 中创建一个电影观看列表应用程序。为此,我有一个 table 用户和一个 table 电影。

目前我为每部添加的电影创建了一个唯一的记录,这会导致现有记录的多个副本,但所有副本都具有不同的用户 ID。所以我正在研究 rails 中的 has_and_belongs_to_many 关系。但是我在我的应用程序中使用它时遇到了一些问题。

据我所知,一个用户可以有多部电影,一部电影可以有多个用户。所以我将其添加到模型中,

movie.rb

has_and_belongs_to_many :users

user.rb

has_and_belongs_to_many :movies

我还创建了一个迁移,

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

但我不确定这一切是如何联系起来的。通过迁移,我添加了一个包含 2 个列的连接 table。 Movie_id 和 user_id。 movie_userstable中的movie_id值是否对应movie table中的movie_iduser_id也是一样,是不是对应user table中的user_id

另外,如何将两个 ID 连接在一起。创建新电影时是否必须将 "something" 添加到 movies_users 连接 table?

这是我现在的movies_controller.rb

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

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

//编辑//

我已经将 has_many_belongs_to 关系添加到我的电影和用户模型中,并且我创建了一个名为 movies_users 的连接 table,其中包含 2 个列 user_idmovie_id.

我在我的页面上创建了 2 个帐户并添加了电影《信条》。这是我 rails 控制台 Movie.all

中的结果
#<Movie id: 1, title: "Creed", user_id: 1, movie_id: "312221">, 
#<Movie id: 2, title: "Creed", user_id: 2, movie_id: "312221">

如您所见,它仍然创建了 2 部不同的电影,尽管它们具有相同的值,user_id 除外。所以看起来没有检查值(movie_id)是否已经存在。我认为这是 habtm 关系的一部分。

我会使用 has_many :through

而不是 habtm
class User
  has_many :movies_users
  has_many :movies, :through => :movies_users

class Movie
  has_many :movies_users
  has_many :users, :through => :movies_users  

class MoviesUser
  belongs_to :movie
  belongs_to :user

现在,每部电影将有一个电影记录,并在用户观看电影时创建一个 movie_user 记录。您可以使用 MoviesUsersController 以 REST 方式执行此操作,您将其称为创建操作,并通过 params = {:movies_user => {:user_id => 123, :movie_id => 456}}

如果您只需要连接 table 并且不需要在连接 table 中存储额外信息,那么在您的情况下使用 habtm 很好。在这种情况下,连接 table (movies_users) 的记录是自动创建的,而您正在使用 has_and_belongs_to_many 方法给出的记录。

您的 create 操作可能如下所示:

def create
   movie = Movie.create(movie_params)
   current_user.movies << movie
   ...
end

或者像这样:

def create
   current_user.movies.create(movie_params)
   ...
end

问题更新后添加

您的 Movie 模型中不需要 movie_iduser_id 字段。这一切应该是这样的:

movie = Movie.last
#<Movie id: 1, title: "Creed">

user = User.last
#<User id: 1, name: "Username", ...>

# add the movie to the user's watch list
user.movies << movie

# a record in the joining table will be created automatically
#<user_id: 1, movie_id: 1>