ruby - Rieles has_and_belongs_to_many y has_many: a través de andamios
ruby-on-rails-3 scaffolding (1)
¿Hay una manera de generar un andamio para los modelos de Rails que tienen ya sea has_and_belongs_to_many o has_many: a través de la relación? Si no es así, ¿hay alguna razón de desarrollo por la que no se haya incluido alguna forma básica de esta funcionalidad? Rails requiere que los desarrolladores generen y editen una "migración de tabla" personalizada ". ¿Es la atención necesaria al detalle una forma de recordar a los desarrolladores de Rails algún hecho importante o es simplemente un ejemplo de cómo Rails es un "trabajo en progreso"?
Una búsqueda rápida de Stackoverflow para:
"has_and_belongs_to_many" yields 821 questions
"has_many :through" yields 933 questions
... y muchos de estos comienzan con "¿Cómo puedo ...?" Así que parece que el tema no es trivial y relevante para los usuarios de SO. Supongo que me pregunto por qué no ha recibido atención. ¿Es el asunto más complejo de lo que parece? El conjunto de características para Rails parece tan extenso. Me pregunto por qué se ha omitido el andamiaje para asociaciones con tablas de combinación.
Por favor, centre su respuesta en las afirmaciones anteriores o "incluya una declaración como," Un andamio debería incluir ... "o" Una secuencia de comandos de generación de rieles necesitaría ... "
¡Gracias!
Me gusta su pregunta, me he preguntado por qué no está incluido en Rails (y como sospecho que no está disponible como una gema). Estas son algunas de las razones por las que eso podría ser un problema. Les explicaré en el ejemplo típico con assemblies
y parts
.
Andamios funciona mediante el uso de generadores para crear archivos. Si migra a una versión más reciente, a veces existe la opción de actualizar los archivos existentes siguiendo estos pasos:
- Copia los existentes a un nuevo nombre.
- Sobrescribir los existentes por otros nuevos.
Eso implica que no hay ninguna noción de agregar archivos o cambiar archivos. EDITAR : Esto no es cierto, hay mecanismos para agregar a los archivos e incluso cambiarlos.
Si observa la generación de, por ejemplo,
has_many :through
(debería ser similar ahas_and_belongs_to_many
), debe hacer lo siguiente:Agregar una migración que crea la tabla de unión.
==> Debería ser posible para los andamios haciendo:
rails g scaffold_hmt Assembly Part
Agrega un modelo para ese modelo de unión.
==> Debería ser posible para el andamio por el andamio anterior.
Cambia los modelos existentes para incluir las líneas:
assembly.rb:
has_many ''assemblies_parts''; has_many :parts, :through => ''assemblies_parts''
has_many ''assemblies_parts''; has_many :parts, :through => ''assemblies_parts''
part.rb:
has_many ''assemblies_parts''; has_many :assemblies, :through => ''assemblies_parts''
has_many ''assemblies_parts''; has_many :assemblies, :through => ''assemblies_parts''
==> Así que no es posible andamios
- Qué hacer con las vistas está muy abierto. Hay ejemplos en RailsCast cómo hacerlo, pero no es en absoluto trivial, y no hay una sola técnica que funcione bien en todas las circunstancias. Creo que los diferentes patrones podrían implementarse como plantillas para andamios (por ejemplo, para usar casillas de verificación o listas de selección múltiple o entrada de texto con finalización). El problema es el mismo que en
has_many
vistas, sin embargo.
Entonces, como resumen, un andamio podría valer la pena intentarlo (vea el siguiente párrafo). Las guías de Rails para crear y personalizar generadores y plantillas de Rails parecen al menos plausibles. Y una solución que genere partes de archivos, los nombre en consecuencia y ayude en la salida del andamio en la consola para hacer el resto a mano podría valer la pena intentarlo.
Ayer traté de encontrar una solución parcial, puedes echarle un vistazo a GitHub . Funciona así:
- Copie el contenido del directorio
scaffold_hmt
(significahas_many :through
) en el directorio de aplicaciones de rieleslib/generators
. - Puede llamar al generador con:
rails g scaffold_hmt Assembly Part
. - Entonces generará:
- Migración para la tabla de unión.
- Modelo para la mesa de unión.
No se pueden cambiar los archivos:
- Modelo
assembly.rb
- Modelo
part.rb
La razón de esto es que el encontrar el lugar correcto no es trivial. Como solución alternativa, imprime lo que debería haberse insertado en los archivos.
c:/apps/ruby/rails3/minds>rails generate scaffold_hmt Assembly Part create db/migrate/20111011135944_create_assemblies_parts.rb create app/models/assemblies_part.rb Try to insert into file: app/models/assembly.rb the following statements: has_many :assemblies_parts has_many :parts, :through => :assemblies_parts insert app/models/assembly.rb Try to insert into file: app/models/part.rb the following statements: has_many :assemblies_parts has_many :assemblies, :through => :assemblies_parts insert app/models/part.rb
- Modelo
Pruébalo y ve si eso te ayudará.