ruby-on-rails - anidados - formularios en ruby on rails
¿Cómo crear un nuevo registro para una asociación de varios a muchos que acepte atributos anidados? (1)
Creo que su problema puede ser que no haya especificado una "clave externa" para las relaciones has_many en el Modelo de usuario. Tratar:
has_many :relationships, foreign_key: "organization_id", dependent: :destroy
Esto identifica de forma única una organización por relación con su modelo de usuario.
Organization
y el User
tienen una asociación muchos a muchos a través de la Relationship
. Inicialmente implementé esta asociación de uno a muchos, que funcionó pero ahora necesito que se convierta en una asociación de varios a muchos. Así que creé el modelo de Relationship
y cambié la asociación en los archivos modelo.
Organization
acepta atributos anidados para el User
ya que en mi aplicación tengo un formulario de registro unido para los dos. Además, lo uso en mi archivo de semillas:
Organization.create!(name: "name", ...).users.create(email: "[email protected]", ...)
Esto funcionó cuando era una asociación de uno a muchos, pero ahora es una asociación de varios a muchos, que se produce al sembrar el error:
Validation failed: Member can''t be blank, Moderator can''t be blank
Esto se refiere a las variables para el modelo de Relationship
, a través del cual el User
y la Organization
están asociados.
¿Qué causa este error? ¿Por qué están estos valores en blanco? ¿Es la línea de creación de Organization.create
quizás incorrecta para una asociación de muchos a muchos? member
y moderator
tienen valores predeterminados (ver archivo de migración). Esperaría que creara la organization
, el user
y la relationship
con los valores predeterminados. ¿De qué otra forma debería estar creando una nueva organización y usuario?
El modelo de organización:
has_many :relationships, dependent: :destroy
has_many :users, through: :relationships
accepts_nested_attributes_for :relationships, :reject_if => :all_blank, :allow_destroy => true
validates_associated :users
El modelo de relación:
belongs_to :organization
belongs_to :user
accepts_nested_attributes_for :user
validates_presence_of :organization
validates_presence_of :user
validates :member, presence: true
validates :moderator, presence: true
El modelo de usuario:
has_many :relationships, dependent: :destroy
has_many :organizations, through: :relationships, inverse_of: :users
La relación de migración:
class CreateRelationships < ActiveRecord::Migration
def change
create_table :relationships do |t|
t.belongs_to :user, index: true
t.belongs_to :organization, index: true
t.boolean :member, null: false, default: false
t.boolean :moderator, null: false, default: false
t.timestamps null: false
end
add_index :relationships, [:user_id, :organization_id], unique: true
end
end