如何在rails上的ruby中创建3表连接迁移

时间:2015-09-24 06:43:35

标签: ruby-on-rails

我有3张桌子,学生留言和教练。 现在我想用message_id coach_id和student_id

创建一个连接迁移表

请帮助创建迁移查询

任何帮助都非常感谢

在我尝试以下代码时出现此错误

== 20150924072052 AssociationTable: migrating
=================================                                                   
-- create_table(:associations)
rake aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: Key column 'student_id' doesn't exist in table: ALTER TABLE   `associations` ADD CONSTRAINT `fk_rails_122f0db022` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`)`

1 个答案:

答案 0 :(得分:2)

会是这样的:

$ rails g migration AssociationTable

...将创建如下文件:

#db/migrate/association_table_[timestamp].rb
class AssociationTable < ActiveRecord::Migration
  def change
    create_table :associations do |t|
      t.references :student
      t.references :message
      t.references :coache
      t.timestamps null: false
    end
  end
end

这将创建一个包含以下列的表:

id
student_id
message_id
coach_id
created_at
updated_at

这将用于has_many :through关系,这需要您拥有join model

#app/models/association.rb
class Association < ActiveRecord::Base
   belongs_to :student
   belongs_to :message
   belongs_to :coach
end

-

要了解has_many :throughhas_and_belongs_to_many之间的选择,您需要了解以下内容:

两者之间的主要区别在于has_many :through使用了join model。连接模型基本上是一个模型,ActiveRecord将通过该模型填充依赖关联数据。简而言之,它加入&#34;两个模特在一起。

虽然联接模型是HABTMHMT之间的最大区别,但还有另一个技术原因可供您选择 - HMT允许您在连接模型中有额外的属性

这对于这样的事情很重要:

#app/models/doctor.rb
class Doctor < ActiveRecord::Base
   has_many :appointments
   has_many :patients, through: :appointments
end

#app/models/appointment.rb
class Appointment < ActiveRecord::Base
   #columns id | doctor_id | patient_id | time | created_at | updated_at
   belongs_to :doctor
   belongs_to :patient
end

#app/models/patient.rb
class Patient < ActiveRecord::Base
   has_many :appointments
   has_many :doctors, through: :appointments
end

因此,联接模型(约会)将能够提供您可以与其他模型一起使用的特定数据:

@doctor = Doctor.find 1
@appointments = @doctor.appointments.where(time: ____)
@patients = @appointments.patients

很多疑问。我希望你明白这一点。

enter image description here

-

has_and_belongs_to_many要简单得多,虽然我不确定它是否适用于3张桌子(不知道为什么它不应该这样)。

enter image description here

这消除了对连接模型的需要,并且在此过程中阻止您在关联中使用额外属性(请注意连接没有id或{ {1}}属性?)。 HABTM表的命名约定为timestamp - 在您的情况下 albabetical_plurals

同样,我不知道这是否适用于3方式加入,但是这里是你如何做到的:

recipient_messages

具体考虑您的要求,我说您#app/models/student.rb class Student < ActiveRecord::Base has_and_belongs_to_many :messages, join_table: "recipients_messages", foreign_key: "recipient_id", association_foreign_key: "message_id" end #app/models/message.rb class Message < ActiveRecord::Base has_and_belongs_to_many :recipients, join_table: "recipients_messages", foreign_key: "message_id", association_foreign_key: "recipient_id" end 会更好。

原因是,如果您要发送消息,则需要一种方法来了解消息的发送对象,内容以及是否已被阅读。

我会使用has_many :through作为连接模型:

messages