Rails多对多SQLite3错误

时间:2012-07-02 20:17:09

标签: ruby-on-rails sqlite ruby-on-rails-3.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

2 个答案:

答案 0 :(得分:2)

我认为gabrielhilal的答案不太正确:不推荐在连接表中使用额外属性,因此您需要删除迁移中的时间戳,然后它应该可以正常使用has_and_belongs_to_many它本身已弃用。

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

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

答案 1 :(得分:1)

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

根据Rails Guide

  

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

我知道您没有在连接表中添加任何额外属性,但请尝试将迁移更改为以下内容,我认为这是default

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