我试图在Rails 3.2.11中的两个模型之间创建一个多对多关系。
一个用户可以与许多偶发事件相关联,反之亦然。
class User < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
has_many :incident_participants, foreign_key: "participant_id"
has_many :participated_incidents, through: :incident_participants
end
class Incident < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
has_many :incident_participants, foreign_key: "participated_incident_id"
has_many :participants, through: :incident_participants
end
联接表:
class IncidentParticipant < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
t.belongs_to :participant, class_name: "User"
t.belongs_to :participated_incident, class_name: "Incident"
end
事故参与者表
create_table "incident_participants", :force => true do |t|
t.integer "participant_id"
t.integer "participated_incident_id"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
那么,为什么rails没有得到这种关系呢?当我尝试在我的视图中执行@incident.participants时,我会收到以下错误:
"找不到源关联:参与者或:模型IncidentParticipant中的参与者。尝试"has_many":参与者,:through=>:incident_participants,:source=>'。是其中之一吗?"
有什么想法吗?
尝试取出t.belongs_to
并替换为belongs_to
。
要创建多对多关联,应该考虑创建一个关联表。也就是说,您将有两个指向排序临时表的1-M关系。例如:
在您的第一个模型中:
class Example < ActiveRecord::Base
has_and_belongs_to_many :example2
end
在您的第二种型号中:
class Example2 < ActiveRecord::Base
has_and_belongs_to_many :example
end
然后,您需要编写一个迁移来将两个表链接在一起:
class CreateTableExamplesExamples2 < ActiveRecord::Migration
create_table :examples_examples2 do |t|
t.integer :example_id
t.integer :example2_id
end
end
那就让rails的魔法发挥作用吧。查看指南了解更多信息。