ruby-on-rails Ruby on Rails:多对多关系与一对多关系位于同一个表上

iugsix8n  于 2023-07-01  发布在  Ruby
关注(0)|答案(1)|浏览(98)

我正在学习Ruby on Rails,目前正在努力实现多对多的关系。我有一个用户和一个拼车,可以由一个用户驾驶,由多个用户乘坐。因此,我尝试用has_and_belongs_to_many实现一个连接表carpools_users。我假设我的模型出了问题,但我不知道我到底做错了什么。
当前会抛出RuntimeError,因为我违反了carpools_users.carpool_id的非空约束。

移民

20230621132948_create_carpools.rb

class CreateCarpools < ActiveRecord::Migration[7.0]
  def change
    create_table :carpools do |t|
      t.references :driver, foreign_key: { to_table: 'users' }
      t.references :passenger, foreign_key: { to_table: 'users' }

      t.timestamps
    end
  end
end

20230621123159_create_users.rb

class CreateUsers < ActiveRecord::Migration[7.0]
  def change
    create_table :users do |t|
      t.string :name
      t.references :ridden_carpool, foreign_key: { to_table: 'carpools' }
      t.references :driven_carpool, foreign_key: { to_table: 'carpools' }

      t.timestamps
    end

    create_join_table :users, :carpools, :id => false
  end
end

型号

  • 拼车.rb*
class Carpool < ApplicationRecord
  belongs_to :driver, :class_name => 'User', :foreign_key  => "driver_id"
  has_and_belongs_to_many :passenger, :class_name => 'User', :foreign_key  => "user_id"
end
  • user.rb*
class User < ApplicationRecord
    has_many :driven_carpools, :class_name => "Carpool", :foreign_key  => "driven_carpool_id"
    has_and_belongs_to_many :ridden_carpools, :class_name => "Carpool", :foreign_key  => "carpool_id"
end
cigdeys3

cigdeys31#

在你的CreateUser中,在这一行,:id => false,我认为没有必要。当您创建一个连接表时,该表将有2列,其中包含默认情况下包含的每个模型的id,仅此而已。选中此处create_join_table和此处Create Join Table

create_join_table :users, :carpools

在你的CreateCarPool中,我相信你有很多乘客,所以passenger应该是复数。

t.references :passengers, foreign_key: { to_table: 'users' }

同样在CarPool中,在他的行中,passenger应该是复数。

has_and_belongs_to_many :passengers, :class_name => 'User', :foreign_key  => "user_id"

也许在你的User模型中,你要更新has_many上的foreign_key,并将join表添加到has_and_belongs关系中。您的用户在CarPool中的foreign_key是driver_id,这是您用来关联的那个。

class User < ApplicationRecord
  has_many :driven_carpools, class_name: "Carpool", foreign_key: "driver_id"
  has_and_belongs_to_many :ridden_carpools, class_name: "Carpool", join_table: "carpools_users", association_foreign_key: "carpool_id"
end

另一件事是。我不知道您创建这些表和更新模型的顺序,但您需要首先遵循User,基本CarPool,rails db:migrate,然后更新模型,始终记住在更改后进行迁移。对于要使用的na ID,您首先需要在进行下一步之前进行迁移。

相关问题