【发布时间】:2016-09-04 02:12:04
【问题描述】:
目标:用户可以创建一个用户帐户(设计),然后创建一个组。每个用户只有belongs_to一组和一组has_many用户。
创建并运行迁移后 - 如果我尝试创建用户,我将收到以下错误:“1 错误禁止保存此用户:组必须存在”。
显然,当前设置希望在创建用户时存在 group_id。
- 对于这种情况,belongs_to / has_many 关联是否正确?这应该是 has_one 吗?
- 两个迁移都应该有外键属性吗?
- 在
GroupsController#create中设置@group.user_id = current_user.id是否适合将创建用户分配到组?我尝试在 Groups 模型中使用回调来执行此操作,但我无法访问current_user变量。 - 我还想强制(在数据库级别)用户只能属于一个组 - 这是在架构中使用
unique => true实现的吗? - 如何(在数据库级别)强制组必须有用户?
.
class Group < ApplicationRecord
has_many :users
validates :users, presence: true
end
class User < ApplicationRecord
...
belongs_to :group
...
end
class GroupsController < ApplicationController
...
def create
@group = Group.new(group_params)
@group.user_id = current_user.id
...
end
...
private
...
def group_params
params.require(:group).permit(:name, :user_id)
end
...
end
class AddGroupReferenceToUser < ActiveRecord::Migration[5.0]
def change
add_reference :users, :group, foreign_key: true
end
end
class AddUserReferenceToGroup < ActiveRecord::Migration[5.0]
def change
add_reference :groups, :user, foreign_key: true
end
end
ActiveRecord::Schema.define(version: 20160903125553) do
create_table "groups", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.index ["user_id"], name: "index_groups_on_user_id"
end
create_table "users", force: :cascade do |t|
...
t.integer "group_id"
t.index ["email"], name: "index_users_on_email", unique: true
t.index ["group_id"], name: "index_users_on_group_id"
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
end
end
【问题讨论】:
-
你是说
Group有很多Users。因此,您的用户表中应该有一个group_id。不在组表中。你可以创建一个Group,比如current_user.group.new(group_params)
标签: ruby-on-rails associations model-associations