Ruby on rails 在Rails上创建多对多记录

Ruby on rails 在Rails上创建多对多记录,ruby-on-rails,ruby,many-to-many,favorites,Ruby On Rails,Ruby,Many To Many,Favorites,我有一个简单的任务列表应用程序,上面有用户和列表,用户由Desive管理,可以创建任务列表,以及其他用户或自己创建的收藏夹列表。用户和列表之间的所有权关系很容易建立,但我很难建立用户喜欢列表的关系。我设想这是一种多对多关系,毕竟,一个用户可以喜欢许多列表,而一个列表可以被许多用户喜欢,这种关系发生在另一个已经存在的用户列表所有权的一对多关系之上,这让我犹豫了一下,这是否是一种好的做法,但我还是不顾一切地继续我的尝试 目前,我有两个模型,一个用于用户,一个用于列表,我试图通过运行rails g m

我有一个简单的任务列表应用程序,上面有用户和列表,用户由Desive管理,可以创建任务列表,以及其他用户或自己创建的收藏夹列表。用户和列表之间的所有权关系很容易建立,但我很难建立用户喜欢列表的关系。我设想这是一种多对多关系,毕竟,一个用户可以喜欢许多列表,而一个列表可以被许多用户喜欢,这种关系发生在另一个已经存在的用户列表所有权的一对多关系之上,这让我犹豫了一下,这是否是一种好的做法,但我还是不顾一切地继续我的尝试

目前,我有两个模型,一个用于用户,一个用于列表,我试图通过运行
rails g migration CreateJoinTableFavorites users list
为收藏夹创建迁移,这导致了以下迁移

class CreateJoinTableFavorites < ActiveRecord::Migration[5.2]
  def change
    create_join_table :users, :lists do |t|
      t.index [:user_id, :list_id] <-- I uncommented this line
      # t.index [:list_id, :user_id]
      t.timestamps <-- I added this line
    end
  end
end
我知道,如果没有联接表的模型,我就无法实现这一点,但即使我有了该模型,我也没有太多机会在控制器中搜索如何创建该关系。总之,我的模型如下:

class List < ApplicationRecord
    belongs_to :user
    has_many :users, through: :lists_users
end
类列表
class用户

总而言之,我知道我缺少联接表的一个模型,我想一步一步地了解如何创建它、给它取什么名称等,以及如何在控制器中的操作中继续创建新的收藏夹条目。您可以尝试以下操作:

class User
  has_and_belongs_to_many :lists
end

class List
  has_and_belongs_to_many :users
end

class CreateUsersAndLists
  def change
    create_table :users do |t|
      # Code
    end

    create_table :lists do |t|
      # Code
    end

    create_table :users_lists id: false do |t|
      t.belongs_to :user, index: true
      t.belongs_to :list, index: true
      t.boolean :is_favourite
    end
  end
end

有两种方法可以在Rails中创建多对多关系。你所做的似乎把这两者混为一谈,我怀疑这是你问题的根源

简而言之,这两种方法是:

1)
有很多:其他模型,通过::relation

2)
拥有且属于许多其他车型

主要区别在于“has_many-through”方法希望联接表是一个单独的模型,如果需要,可以独立于此关系进行处理,而“has_和_-through”方法不要求联接表具有相应的模型。在后一种情况下,您将无法独立处理联接表。(顺便说一句,这使得连接表上的时间戳毫无用处。)

您应该使用哪种方法取决于您的用例。报告很好地总结了这些标准:

最简单的经验法则是,如果需要将关系模型作为一个独立实体使用,则应通过关系设置一个has\u many:through关系。如果不需要对关系模型执行任何操作,则可以更简单地设置has\u和\u属于\u many关系(尽管您需要记住在数据库中创建联接表)。(重点已添加)


现在回答你的问题:当你使用
create_join_table
时,你把它当作是在为一个has_和_-behing_-to_-many关系设置东西。
create_join_table
将创建一个名为
“#{table1}{table2}”的表,ID指向这些表。它也会按字母顺序排列,这就是为什么你会得到这些表“列出用户”而不是“用户列表”。这实际上是rails联接表的标准命名约定,如果您计划使用
has\u,并且\u属于\u many
,通常不应重命名

如果您确实想使用
has\u和\u归属\u many
,请使用
create\u join\u表
保持迁移,并在您的模型中执行以下操作:

#user.rb
类用户
_和_属于多个:列表
结束
#list.rb
班级名单
_和_属于_许多:用户吗
结束
瞧,不需要
最喜欢的
模型,rails足够聪明,可以自己通过表处理关系。尽管有点简单,但缺点是,如上所述,您无法将联接表作为一个独立的模型来处理。(同样,在这种情况下,联接表上的时间戳是无用的,因为Rails不会设置它们。)

编辑:由于不能直接触摸列表和用户,因此可以通过在用户上设置列表关系或在列表上设置用户关系来创建关系,如下所示:

def添加收藏夹
list=list.find(参数[:list\u id])

current_user.lists让我知道这是否有意义这并不能真正回答我应该如何在“List_users”中创建实际条目“表,我正试图在我的
add\u favorites
action上做这件事,用add\u favorite方法编辑了每个案例的答案。再次,我推荐has\u many through path over has\u and\u belown\u to \u many谢谢你,这真的解释得很好,效果很好,干杯!
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :lists
  has_many :lists, through: :lists_users
end
class User
  has_and_belongs_to_many :lists
end

class List
  has_and_belongs_to_many :users
end

class CreateUsersAndLists
  def change
    create_table :users do |t|
      # Code
    end

    create_table :lists do |t|
      # Code
    end

    create_table :users_lists id: false do |t|
      t.belongs_to :user, index: true
      t.belongs_to :list, index: true
      t.boolean :is_favourite
    end
  end
end