Ziel: Ein Benutzer kann ein Benutzerkonto (Gerät) und anschließend eine Gruppe erstellen. Jeder Benutzer nur belongs_to
eine Gruppe und eine Gruppe has_many
Benutzer.Rails - gehören zu has_many association error
Nach dem Erstellen und Ausführen der Migrationen - Wenn ich versuche, einen Benutzer zu erstellen, wird der folgende Fehler angezeigt: "1 Fehler beim Speichern dieses Benutzers: Gruppe muss vorhanden sein".
Offensichtlich möchte das aktuelle Setup eine group_id beim Erstellen eines Benutzers existieren.
- Ist eine assigns_to/has_many-Zuordnung für diese Situation korrekt? Sollte das ein has_one sein?
- Sollten beide Migrationen ein Fremdschlüsselattribut haben?
- Ist die Einstellung
@group.user_id = current_user.id
inGroupsController#create
eine geeignete Methode, um den Erstellungsbenutzer der Gruppe zuzuweisen? Ich habe versucht, dies im Groups-Modell zu tun, indem ich einen Callback benutzte, aber ich konnte nicht auf die Variablecurrent_user
zugreifen. - Ich möchte auch (auf der Datenbankebene) erzwingen, dass ein Benutzer nur zu einer Gruppe gehören kann - Wird dies erreicht mit
unique => true
im Schema? - Wie kann ich (auf Datenbankebene) erzwingen, dass eine Gruppe einen Benutzer haben muss?
.
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
Sie sagen "Gruppe" hat viele 'Benutzer'. Es sollte also eine 'group_id' in Ihrer Benutzertabelle geben. Nicht in der Gruppentabelle. Und Sie können eine 'Gruppe' wie' aktuelle_benutzer.gruppe.neu (group_params) 'erstellen – Emu