【问题标题】:Ruby on Rails creating HABTM relationship, currently getting Could Not Find TableRuby on Rails 创建 HABTM 关系,目前无法找到表
【发布时间】:2014-10-01 06:43:21
【问题描述】:

我正在尝试将 belongs_to 关系更改为 has_and_belongs_to_many 关系。以下是我尝试过的迁移:

迁移1

class RemoveSyndicateMemRef < ActiveRecord::Migration
  def change
    remove_reference :syndicate_members, :syndicate

    create_table :members_syndicates, id: false do |t|
        t.belongs_to :syndicate
        t.belongs_to :syndicate_member
    end
  end
end

迁移 2:

class MultipleSyndicatesPerUser < ActiveRecord::Migration
  def change
    drop_table :members_syndicates

    create_table :members_syndicates, id: false do |t|
        t.references :syndicate, null: false
        t.references :syndicate_member, null: false

    end

  end
end

当我尝试使用任何 HABTM 方法时,我不断得到一个

ActiveRecord::StatementInvalid: Could not find table 'syndicate_members_syndicates'

错误。

我对 Rails 比较陌生,所以我不确定这里出了什么问题。任何为我指明正确方向的帮助将不胜感激。

更新:

在我修复运行 &gt; syn.syndicate_members.build() 的 db 表的名称后返回:

ActiveModel::MissingAttributeError: can't write unknown attribute `syndicate_id'

【问题讨论】:

    标签: ruby-on-rails ruby activerecord migration


    【解决方案1】:

    您的表名不符合 Rails 的命名约定。要命名一个连接表,您应该按字母顺序连接另一个表的名称。

    在本例中为“syndicate_members_syndicates”,因为您的表被命名为syndicate_memberssyndicates

    您可以通过以下方式解决此问题:

    • 您可以恢复迁移,将其从 create_table :members_syndicates 更改为 create_table :syndicates_members_syndicates,然后再次运行。这将修复表名。

    • 您可以将:join_table =&gt; 'members_syndicates' 添加到SyndicateSyndicateMember 模型中的has_and_belongs_to_many 声明中。这告诉 Rails 不要使用自动生成的名称作为表名,而是使用members_syndicates。在这种情况下,您无需更改表名。

    【讨论】:

    • 感谢您的回答,但我不完全理解您建议的解决方案。您能否说明您将如何更改迁移?
    • @apardes 更新我的答案,希望对您有所帮助。您有具体的疑问或问题吗?
    • 感谢您的澄清,解决了该问题,但提出了另一个问题。我用新错误更新了我的问题。
    • 能否请您发布我们的模型(至少是belongs_tohas_onehas_manyhas_and_belongs_to_many 声明)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多