我在rails / angular中创建了一个电影观察列表应用。为此,我有一个用户桌和一个带电影的桌子。
目前,我为每个添加的电影创建了一个唯一的记录,这会产生现有记录的多个副本,但所有记录都具有不同的用户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个列的连接表。 Movie_id和user_id。 movie_id
表格中的movie_users
值是否与movie_id
中的movie table
相对应?同样适用于user_id
,是否与user_id
中的user table
相对应?
另外,如何将两个ID连接在一起。我是否必须添加&#34;某些内容&#34;创建新电影时到movies_users
联接表?
这是我目前的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
// // EDIT
我已将has_many_belongs_to
关系添加到我的电影和用户模型中,并创建了一个名为movies_users
的联接表,其中包含2个列user_id
和movie_id
。< / p>
我已在我的网页上创建了2个帐户,并添加了电影Creed。这是我的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关系的一部分。
答案 0 :(得分:4)
我会使用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执行此操作,您可以将其称为创建操作,并通过params = {:movies_user => {:user_id => 123, :movie_id => 456}}
答案 1 :(得分:1)
如果您只需要关联的连接表而不需要在连接表中存储额外信息,则可以在您的情况下使用habtm
。在这个c \\中,当您使用has_and_belongs_to_many
方法时,会自动创建连接表(movies_users)的记录。
您的create
行为可能如下所示:
def create
movie = Movie.create(movie_params)
current_user.movies << movie
...
end
或者像这样:
def create
current_user.movies.create(movie_params)
...
end
更新问题后添加
您的电影模型中不需要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 joinning table will be created automatically
#<user_id: 1, movie_id: 1>