我有一个包含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部电影和多个用户之间创建关系?
答案 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:
-
顺便说一下,还有一些你需要注意的事情。
您目前在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