ruby-on-rails - SQLite3::ConstraintException:约束失败:在 Rails 中插入 INTO 连接模型

标签 ruby-on-rails sqlite activerecord

在我的模型中,项目拥有并属于许多用户,因此他们有一个连接表 projects_users。当我插入线

@project.members += User.find params[:member_ids].split(',')

进入项目 Controller 的创建操作,我无法保存@project。当我尝试时,我收到以下错误:
SQLite3::ConstraintException: constraint failed: INSERT INTO "projects_users" ("project_id", "user_id") VALUES (5, 14600)

但是,就在保存之前,@project 有效并且@project.members 返回正确的成员。我究竟做错了什么?

最佳答案

听起来您可能对 DB 列有一个不允许重复的唯一约束 project_iduser_id projects_users 中的对,但 Rails 不知道,因此验证通过,但实际保存失败。

如果是这种情况,您可以使用 has_many through关系和连接表的模型并验证唯一性。我怀疑你已经在做其中的一部分了。这样的事情可能会有所帮助:

class Project < ActiveRecord::Base
  has_many :members
  has_many :users, through: :project_membership
end

class User < ActiveRecord::Base
  has_many :projects, through: :project_membership
end

class ProjectMembership < ActiveRecord::Base
  self.table_name = "projects_users"
  belongs_to :project
  belongs_to :user
  validates :project_id, uniqueness: { scope: :user_id }
end

您可能想要重命名您的 projects_users如果这一切都解决了,请使用表,例如 project_memberships如上例;那么你可以放弃 self.table_name .

关于ruby-on-rails - SQLite3::ConstraintException:约束失败:在 Rails 中插入 INTO 连接模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15463598/

相关文章:

ruby-on-rails - 使用 `id' gem 时出现 Rails NoMethodError(未定义方法 'protected attributes' ...)

android - 具有来自各种表的数据的 ExpandableListView

ios - SQLITE更新表问题

mysql - yii2中删除相关记录——最佳实践

ruby-on-rails - rails : ActiveRecord query based on association value

ruby-on-rails - Ruby/Rails 如何在 DateTime 范围内迭代月份?

ruby-on-rails - 为什么Unicorn需要和Nginx一起部署?

ruby-on-rails - rake 中止!不允许操作 - Carrierwave 删除验证失败的 tmp 文件

Android 应用程序离线同步到 Azure SQL Server 和 Blob 存储

mysql - 加入 has_many :through attributes