rails YAML:NOT NULL约束在连接表时失败

时间:2015-07-14 12:52:48

标签: ruby-on-rails ruby-on-rails-4 yaml rails-activerecord

Rails 4.2 我设置了Role模型和Permission模型,它通过另一个模型RolesPermission将多对多关系相互关联我使用has_many:through关联模型。

RolesPermission的表名为permissions_roles,因为Rails convention我通过迁移从roles_permissions重命名了它,我把它放在模型类中:

self.table_name = "permissions_roles"

我设置了用于测试的灯具

在roles.yml我有

admin:
  name: admin
  permissions: create_user

并且在permissions.yml中我有

create_user:
  name: create_user
  description: Create a new user

edit_user:
  name: edit_user
  description: Edit any user details

view_all_users:
  name: view_all_users
  description: View all users

现在当我运行rake test时,每次测试都会收到此错误:

ActiveRecord::StatementInvalid:     
ActiveRecord::StatementInvalid: 
SQLite3::ConstraintException: NOT NULL constraint failed:
permissions_roles.created_at: INSERT INTO "permissions_roles" ("role_id", "permission_id") VALUES (135138680, 204622624)

当我从YAML中删除admin角色的权限时,错误消失了。

发生了什么?

修改

加入表在架构中如下所示:

create_table "permissions_roles", force: :cascade do |t|
  t.integer  "role_id"
  t.integer  "permission_id"
  t.datetime "created_at",    null: false
  t.datetime "updated_at",    null: false
end

2 个答案:

答案 0 :(得分:3)

我逐渐得出的结论是,我不可能按照我想做的方式做我想做的事。

我看到在rails fixtures中,我无法利用ActiveRecord中使用:through标签的关系

首先,这可以通过假定加入表的某个名称来证明,如果它是another question I asked中所见的has_and_belongs_to_many关系,它将具有该名称,其次是问题表明它还假定加入表没有created_at列,如果关系为has_and_belongs_to_many,也会出现这种情况。

由于当关系使用:through时,rails fixtures不支持方便语法,我必须将关系fixture放在roles_permissions.yml文件中,或者我必须使用{{简化模型中的关系。 1}}。

答案 1 :(得分:0)

created_at权限中填写create_user。您可能在create_at字段上打破了数据库级验证(它不能为空)。

  

SQLite3 :: ConstraintException:NOT NULL约束失败:   permissions_roles.created_at: