ゴール:ユーザは、ユーザアカウント(作成者)を作成し、その後グループを作成することができます。各ユーザーはbelongs_to
グループとグループhas_many
ユーザーのみです。Rails - belongs_to has_many関連エラー
マイグレーションを作成して実行した後 - ユーザーを作成しようとすると、次のエラーが表示されます。「1エラーでこのユーザーを保存できませんでした:グループは存在しています」
明らかに、現在のセットアップでは、ユーザー作成時にgroup_idが存在する必要があります。
- この状況ではbelongs_to/has_manyの関係は正しいですか?これはhas_oneですか?
- 両方の移行に外部キー属性が必要ですか?
@group.user_id = current_user.id
をGroupsController#create
に設定すると、作成するユーザーをグループに割り当てるのに適していますか?グループモデルでコールバックを使用してこれを実行しようとしましたが、変数current_user
にアクセスできませんでした。- 私はまた、(データベースレベルで)ユーザが1つのグループにしか属していないことを強制したいと思います - これはスキーマ内で
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
「グループ」には多くの「ユーザー」があると言っています。だから、あなたのuserテーブルに 'group_id'があるはずです。グループテーブルにはありません。そして、あなたは 'current_user.group.new(group_params)'のような 'Group'を作成することができます – Emu