有没有人知道另一种创建连接表迁移的方法,并在连接表中指定引用列的特定名称?

时间:2016-10-12 13:15:55

标签: ruby-on-rails ruby activerecord

我有这两个模型:

 module Studying
  class Student < ApplicationRecord
   has_and_belongs_to_many :instructors,
                        class_name: 'Studying::Instructor',
                        foreign_key: 'studying_student_id',
                        association_foreign_key: 'studying_instructor_id'
  end
end


 module Studying
  class Instructor < ApplicationRecord
   has_and_belongs_to_many :students,
                        class_name: 'Studying::Student',
                        foreign_key: 'studying_instructor_id',
                        association_foreign_key: 'studying_student_id'
  end
end

对于join_table,我已经生成了迁移:

def change
  create_table :studying_instructors_students, id: false do |t|
  t.belongs_to :studying_instructor, index: { name: 'index_instructors_students_on_studying_instructor_id' }
  t.belongs_to :studying_student, index: { name: 'index_instructors_students_on_studying_student_id' }
  end
end

所有一切都运转良好,但重点是,我的高级同志告诉我,我不应该在模特中使用诸如:

  foreign_key:  'studying_instructor_id',

  association_foreign_key: 'studying_student_id'  

但不是这些我应该使用:

  foreign_key:  'instructor_id', 

  association_foreign_key: 'student_id'

并且在第一个模型中以相同的方式,因为这违反了惯例。 我不知道如何在这个模型和表格中做到这一点(你如何理解db中的表名:studying_instructors和studying_students)。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以这样创建关系表

def change
  create_table :studying_instructors_students, id: false do |t|
    t.integer :instructor_id, index: true
    t.integer :student_id, index: true
  end
end

然后您可以使用foreign_key: 'instructor_id',association_foreign_key: 'student_id'

如果我采取了错误的方式,请随时解决其他问题。

答案 1 :(得分:0)

我会做这样的事情:

class Studying::Student < ApplicationRecord
  has_many :student_instructors, class_name: 'Studying::StudentInstructor'
  has_many :instructors, through: :student_instructors, class_name: 'Studying::Instructor'

end

class Studying::Instructor < ApplicationRecord
  has_many :student_instructors, class_name: 'Studying::StudentInstructor'
  has_many :students, through: :student_instructors, class_name: 'Studying::Instructor'      
end

class Studying::StudentInstructor < ApplicationRecord
  belongs_to :student, class_name: 'Studying::Student'
  belongs_to :instructor, class_name: 'Studying::Instructor'      
end

我这里有三张桌子。一个是学生,第二个是教师,第三个是联络表(student_instructors)。

studnt_instructor的迁移看起来像这样

def change
  create_table :student_instuctors, id: false do |t|
    t.integer :instructor_id, index: true
    t.integer :student_id, index: true
  end
end

我还没有验证语法,但这更多是逻辑解释。

我希望这会有所帮助。