ActiveRecord :: StatementInvalid:PG :: UndefinedTable:错误:与HABTM与rails关联的关系

时间:2018-07-07 15:53:46

标签: ruby-on-rails activerecord migration ruby-on-rails-5 has-and-belongs-to-many

我有两个具有habtm关联的企业模型和deal_event。这种关系适用于create和当我这样做

Enterprise.last.deal_events

但是抛出错误

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "deal_events_enterprises" does not exist LINE 1: ...CT  "enterprises".* FROM "enterprises" INNER JOIN "deal_even...

当我这样做

DealEvent.last.enterprises

我的模特

enterprise.rb

has_and_belongs_to_many :deal_events

deal_event.rb

has_and_belongs_to_many :enterprises

迁移

class CreateDealEventsEnterprisesJoinTable < ActiveRecord::Migration[5.1]
  def change
    create_join_table :deal_events, :enterprises do |t|
      t.index :deal_event_id
      t.index :enterprise_id
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您应该将联接表命名为deal_event_enterprises(注意,不要使用复数Deal_event)。您的迁移看起来像这样

class CreateDealEventEnterprises < ActiveRecord::Migration[5.1]
  def change
    create_table :deal_event_enterprises do |t|
      t.integer :deal_event_id
      t.integer :enterprise_id
    end
  end
end

如果将具有has_and_belongs_to_manydeal_event_enterprises列的连接表迁移为deal_event_id,则您的enterprise_id关联应该可以正常工作。

但是,建议通过为联接表定义模型类has_many :through来定义与DealEventEnterprise的多对多关系。 这会使您的代码更冗长,并且可以在需要时向联接模型添加其他逻辑。设置has_many :through如下所示:

class DealEventEnterprise < ApplicationRecord
  belongs_to :deal_event
  belongs_to :enterprise
end

class Enterprise < ApplicationRecord
  has_many :deal_event_enterprises
  has_many :deal_events, through: :deal_event_enterprises
end

class DealEvent < ApplicationRecord
  has_many :deal_event_enterprises
  has_many :enterprises, through: :deal_event_enterprises
end