建立一种关系

时间:2015-11-13 13:13:37

标签: ruby-on-rails has-and-belongs-to-many

我在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_idmovie_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关系的一部分。

2 个答案:

答案 0 :(得分:4)

我会使用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执行此操作,您可以将其称为创建操作,并通过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_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 joinning table will be created automatically
#<user_id: 1, movie_id: 1>