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
答案 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: