Inserte automáticamente un nuevo registro en la asociación cuando use has_one o has_many

En este momento tengo dos tablas, usuarios y roles, por supuesto, los roles tienen un ID de usuario y el modelo de roles tiene belongs_to :user y el modelo de usuario tiene has_one :role. La pregunta que me pregunto es, ¿cómo hago para que el modelo de usuario cree el nuevo registro en el modelo de roles? Entiendo que puedo hacer esto fuera del modelo con la misma facilidad con la que creo el usuario, pero creo que podría ser más ágil y mantener todo en un solo lugar y simplificarlo si lo hago en el modelo de usuario. ¿Hay alguna sugerencia sobre cómo podría hacer esto fácilmente sin conocer la identificación del usuario antes de guardarlo?

Nota: (Solo permitiría esto cuando new_record? sea verdadero, de lo contrario estará prohibido).

preguntado el 12 de junio de 12 a las 21:06

si el usuario solo tiene un rol, ¿por qué usar una tabla separada para los roles, en lugar de simplemente agregar una columna de roles al modelo de usuario a través de una migración? -

@ entropy_9 Creo que quizás confundes la asociación creada por 'has_one'. El hecho de que un usuario tenga una fila en la tabla de roles no significa que solo tenga un rol absoluto. Sí, supongo que la gente prefiere usar has_many (he visto que se usa muchas veces para esto), pero ¿cuál es el punto cuando hay una asociación uno a uno de roles y usuarios en las filas de las tablas? Eso solo crea ineficiencia en mi opinión, a menos que no entienda bien los documentos. -

ah, ok, debo haber malinterpretado el OP. En problemas similares que tuve en el pasado, solo agregué un campo de 'rol' a la tabla Usuario, especificando un rol predeterminado (por ejemplo, usuario/invitado) en la migración, así que me apoyé en eso en mi comentario original. -

1 Respuestas

Estoy haciendo algo similar con el usuario y su configuración, probablemente esto podría funcionar para usted:

class User < ActiveRecord::Base

#...

has_one :role
before_create :build_a_role

private
  def build_a_role
    self.build_role(role_att: value)
  end
end

Luego, cuando se guarda el usuario, también se guarda el rol.

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.