我:users
表成功是自我参加了所有必要的混乱(这个新手)代码和必要这样做表。 :users
的两个组:teachers
和:students
。
我需要的组:teachers
加入一个一对多与:bands
表(带可能只有一个老师),而在同一时间加入:students
多到许多与:bands
表(带可能有很多学生和反之亦然)。
什么绊倒了我是:students
和:teachers
都是:users
。因此,如果一个时刻,我假装只有一个类型的用户,去一个一对多的(老师)的关系,那么Band
模型belongs_to :user
和User
模型has_many :bands
但是,如果我去了很多一对多(学生)的关系相反,Band
模型has_many :users, through :user_bands
连接表和User
连接表的has_many :bands, through :user_bands
模型。 (UserBands
模型具有belongs_to :user
和belongs_to :band
在这种情况下)
但我需要在同一时间既关系。我还没有真正尝试把has_many :bands
在User
模型的同时有has_many :users
(通过连接表)和belongs_to :users
在乐队中的模型,因为,除非Rails是一个更神奇,比我给它的信贷,也不会区分教师获得单对多,而学生获得的许多一对多。
我还没有尝试我最好的猜测(见下文),因为我承认水性杨花:我的数据库中已经有许多一对多的关系是完好和正常运行的一个庞大的数字。一个时间我试图做一个复杂的改动,它早些时候在这个过程中,它彻底地把事情搞乱如此糟糕,回滚和撤消改变的模型并没有让我回到我会莫名其妙地开始了,所以我不得不去回拉出足够的头发了剃度后从头开始重建一切。我有github上这个时间,所以我应该能够恢复项目,如果它吹起来像以前一样,但Git是自己的挑剔雷区。
所以,如果一些人可以先看看我的猜测,我深深体会到它。这是否正确?我是否需要更新数据库架构之前进行更改?:
User
模型,添加has_many :bands
。Band
模型,添加has_many :students, through :user_bands
;添加belongs_to :teacher
create_bands
迁移,添加t.belongs_to :teacher
UserBands
模型,添加belongs_to :teacher
并在t.belongs_to :teacher
迁移添加create_user_bands
。所需要的关联不是自加盟。自连接主要用于构建树像一个表层次 - 看the guides for a good example。
你只需要两个表之间的多个关联 - 在这里要记住关键一点是,你必须使用唯一的名称为每个关联。如果您声明多个关联的同名后来只是覆盖无误前者。
class AddTeacherIdToBands < ActiveRecord::Migration[5.2]
def change
add_reference :bands, :teacher, foreign_key: { to_table: :users }
end
end
class User < ApplicationRecord
has_many :bands_as_teacher,
class_name: 'Band',
foreign_key: 'teacher_id'
end
class Band < ApplicationRecord
belongs_to :teacher,
class_name: 'User'
end
我们命名协会bands_as_teacher
避免冲突和混乱。这就要求我们必须明确设置class_name
和foreign_key
选项,因为他们不能从名字就可以推断出来。
这是一种在那里你绊倒和过于复杂的解决方案的。如果该关联一对多你不需要涉及连接表。
要创建一个乐队,其成员就需要通过一个连接表中的M2M协会之间的关联:
class CreateBandMemberships < ActiveRecord::Migration[5.2]
def change
create_table :band_memberships do |t|
t.references :band, foreign_key: true
t.references :user, foreign_key: true
t.timestamps
end
end
end
class Band < ApplicationRecord
# ...
has_many :band_memberships
has_many :users, through: :band_memberships
end
class BandMembership < ApplicationRecord
belongs_to :band
belongs_to :user
end
class User < ApplicationRecord
# ...
has_many :band_memberships
has_many :bands, through: :band_memberships
end
您可以通过提供告诉Rails在其加入通过模型使用的关联source
选项改善命名。
class Band < ApplicationRecord
# ...
has_many :band_memberships
has_many :members, through: :band_memberships, source: :user
end
class User < ApplicationRecord
# ...
has_many :band_memberships
has_many :bands_as_member, through: :band_memberships, source: :band
end