我在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
答案 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