整蛊Rails的迁移和建模涉及自连接“:用户”表和“:带”表:同时一个一对多和多对多一对多关系

问题描述 投票:0回答:1

:users表成功是自我参加了所有必要的混乱(这个新手)代码和必要这样做表。 :users的两个组:teachers:students

我需要的组:teachers加入一个一对多与:bands表(带可能只有一个老师),而在同一时间加入:students多到许多与:bands表(带可能有很多学生和反之亦然)。

什么绊倒了我是:students:teachers都是:users。因此,如果一个时刻,我假装只有一个类型的用户,去一个一对多的(老师)的关系,那么Band模型belongs_to :userUser模型has_many :bands

但是,如果我去了很多一对多(学生)的关系相反,Band模型has_many :users, through :user_bands连接表和User连接表的has_many :bands, through :user_bands模型。 (UserBands模型具有belongs_to :userbelongs_to :band在这种情况下)

但我需要在同一时间既关系。我还没有真正尝试把has_many :bandsUser模型的同时有has_many :users(通过连接表)和belongs_to :users在乐队中的模型,因为,除非Rails是一个更神奇,比我给它的信贷,也不会区分教师获得单对多,而学生获得的许多一对多。

我还没有尝试我最好的猜测(见下文),因为我承认水性杨花:我的数据库中已经有许多一对多的关系是完好和正常运行的一个庞大的数字。一个时间我试图做一个复杂的改动,它早些时候在这个过程中,它彻底地把事情搞乱如此糟糕,回滚和撤消改变的模型并没有让我回到我会莫名其妙地开始了,所以我不得不去回拉出足够的头发了剃度后从头开始重建一切。我有github上这个时间,所以我应该能够恢复项目,如果它吹起来像以前一样,但Git是自己的挑剔雷区。

所以,如果一些人可以先看看我的猜测,我深深体会到它。这是否正确?我是否需要更新数据库架构之前进行更改?:

  1. User模型,添加has_many :bands
  2. Band模型,添加has_many :students, through :user_bands;添加belongs_to :teacher
  3. create_bands迁移,添加t.belongs_to :teacher
  4. UserBands模型,添加belongs_to :teacher并在t.belongs_to :teacher迁移添加create_user_bands
ruby-on-rails many-to-many one-to-many rails-migrations self-join
1个回答
0
投票

所需要的关联不是自加盟。自连接主要用于构建树像一个表层次 - 看the guides for a good example

你只需要两个表之间的多个关联 - 在这里要记住关键一点是,你必须使用唯一的名称为每个关联。如果您声明多个关联的同名后来只是覆盖无误前者。

Teachers

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_nameforeign_key选项,因为他们不能从名字就可以推断出来。

这是一种在那里你绊倒和过于复杂的解决方案的。如果该关联一对多你不需要涉及连接表。

Students

要创建一个乐队,其成员就需要通过一个连接表中的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
© www.soinside.com 2019 - 2024. All rights reserved.