我有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`)`
答案 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 :through
和has_and_belongs_to_many
之间的选择,您需要了解以下内容:
两者之间的主要区别在于has_many :through
使用了join model。连接模型基本上是一个模型,ActiveRecord将通过该模型填充依赖关联数据。简而言之,它加入&#34;两个模特在一起。
虽然联接模型是HABTM
和HMT
之间的最大区别,但还有另一个技术原因可供您选择 - 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
很多疑问。我希望你明白这一点。
-
has_and_belongs_to_many
要简单得多,虽然我不确定它是否适用于3张桌子(不知道为什么它不应该这样)。
这消除了对连接模型的需要,并且在此过程中阻止您在关联中使用额外属性(请注意连接表没有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