0

我正在尝试在 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 中找不到源关联 :participant 或 :participants。尝试 'has_many :participants, :through => :incident_participants, :source => '。它是其中之一吗?”

有任何想法吗?

4

2 回答 2

1

尝试取出t.belongs_to并替换为belongs_to.

于 2013-02-08T15:02:08.750 回答
0

要创建多对多关联,您应该考虑创建关联表。也就是说,您将有两个指向排序临时表的 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 神奇地工作。查看指南以获取更多信息。

于 2013-02-08T16:01:24.020 回答