我正在学习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
1条答案
按热度按时间cigdeys31#
在你的CreateUser中,在这一行,
:id => false
,我认为没有必要。当您创建一个连接表时,该表将有2列,其中包含默认情况下包含的每个模型的id,仅此而已。选中此处create_join_table和此处Create Join Table在你的CreateCarPool中,我相信你有很多乘客,所以
passenger
应该是复数。同样在CarPool中,在他的行中,
passenger
应该是复数。也许在你的User模型中,你要更新has_many上的foreign_key,并将join表添加到has_and_belongs关系中。您的用户在CarPool中的foreign_key是driver_id,这是您用来关联的那个。
另一件事是。我不知道您创建这些表和更新模型的顺序,但您需要首先遵循User,基本CarPool,
rails db:migrate
,然后更新模型,始终记住在更改后进行迁移。对于要使用的na ID,您首先需要在进行下一步之前进行迁移。