创建 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_users
table中的movie_id
值是否对应movie table
中的movie_id
? user_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_id
和 movie_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_id
和 user_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>
我正在 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_users
table中的movie_id
值是否对应movie table
中的movie_id
? user_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_id
和 movie_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
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_id
和 user_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>