2

我在 Rails 中创建了多对多关系,这是我的模型和迁移

class Channel < ActiveRecord::Base
  has_and_belongs_to_many :packages
  validates_presence_of :name
end

class Package < ActiveRecord::Base
  has_and_belongs_to_many :channels
  validates_presence_of :name
end

class CreateChannelsPackages < ActiveRecord::Migration
  def change
    create_table :channels_packages, :id => false do |t|
      t.references :channel
      t.references :package

      t.timestamps
    end
    add_index :channels_packages, :channel_id
    add_index :channels_packages, :package_id
  end
end

然后我有一个多项选择,但是当我尝试保存时出现此错误

SQLite3::ConstraintException: constraint failed: INSERT INTO "channels_packages" ("package_id", "channel_id") VALUES (1, 1)

我试图从迁移中删除索引但它没有解决它,其他人有这个问题吗?

顺便说一句,我正在使用 Rails 3.2.6 和 sqlite3 1.3.6

4

2 回答 2

2

我认为 gabrielhilal 的回答并不完全正确:不推荐在连接表中使用额外属性,因此您需要删除迁移中的时间戳,然后它应该可以与 has_and_belongs_to_many 一起正常工作,而 has_and_belongs_to_many 本身并没有被弃用。

但是,如果您确实需要连接表中的其他属性,has_many :through 是可行的方法。

关于这个主题还有另一个问题有很好的答案: Rails migration for has_and_belongs_to_many join table

于 2012-07-05T22:22:09.947 回答
1

我不知道这是否是您的问题的原因,但该has_and_belongs_to_many关联已被弃用。

根据Rails 指南

已弃用在 has_and_belongs_to_many 关联中的连接表上使用额外属性。如果您需要在表上以多对多关系连接两个模型的这种复杂行为,则应使用 has_many :through 关联而不是 has_and_belongs_to_many。

我知道您没有向联接表添加任何额外属性,但尝试将迁移更改为以下,我认为这是默认值

class CreateChannelPackageJoinTable < ActiveRecord::Migration
  def change
    create_table :channels_packages, :id => false do |t|
      t.integer :channel_id
      t.integer :package_id

      t.timestamps
    end
  end
end
于 2012-07-02T23:28:12.777 回答