Asociación correcta entre modelos en Rails 3

Tengo un modelo de Registro y quiero crear un modelo de Campo tal que un Registro dado has_many Campos. De manera similar, quiero que cada campo se asocie con una etiqueta de modo que cada campo has_one Etiqueta. Pero cada etiqueta se puede reutilizar muchas veces entre objetos de campo.

En este caso, solo diría que una etiqueta belongs_to_many ¿Campos? Asimismo, sería correcto decir que el Campo belongs_to_many ¿Registros?

(En última instancia, quiero que el objeto Registro sea un contenedor para varios campos. Imagino tener un formulario en el que pueda agregar dinámicamente nuevos campos y etiquetas, de modo que un registro se vea así:

Record 1
    Tag 1
    Field 1
    Tag 2
    Field 2
    ...

donde cada etiqueta puede extraerse de un grupo preexistente o crearse sobre la marcha) ¡Gracias por la ayuda!

preguntado el 22 de mayo de 12 a las 21:05

1 Respuestas

En primer lugar, recomendaría encarecidamente leer la Guía RoR sobre asociaciones: http://guides.rubyonrails.org/association_basics.html

Ya sea que sea nuevo o necesite un retoque en el uso de Asociaciones en RoR, lea esa guía.

Su pregunta parece ser más una pregunta lógica, pero comenzaré con el código:

class Record < ActiveRecord::Base
   has_and_belongs_to_many :fields
...

class Field < ActiveRecord:Base
   has_and_belongs_to_many :records
   belongs_to :tag
...

class Tag < ActiveRecord:Base
   has_many :fields
...

Cada Registro se conecta a muchos campos diferentes, y cada campo se conecta a muchos Registros diferentes. Este es un ejemplo clásico de una asociación de muchos a muchos. La lógica en su código cuando realmente usa estos modelos es lo que hará que el modelo de registro parezca un contenedor (porque técnicamente podría decir que un campo es un contenedor para muchos registros).

Cada campo tendrá 1 etiqueta asociada, pero esa misma etiqueta podría usarse con cualquier número de campos (se podría decir que los campos son reutilizando las etiquetas). Esta es una asociación de uno a muchos. Al realizar esta conexión, usaría pertenece_a en el modelo de campo y tiene_muchos en el modelo de etiqueta.

Dado que la etiqueta está conectada al modelo de campo, la lógica que está buscando: un registro es un contenedor para campos y etiquetas, tiene sentido con esta configuración.

Aquí hay un ejemplo simple de cómo obtener una etiqueta dentro de un registro:

#Returns the Tag Associated with the first field
#"inside" the first Record in the database.

Record.first.fields.first.tag

Del mismo modo, uno podría ir fácilmente en la dirección opuesta:

Tag.first.fields.first.records.first


Asegúrese de aprovechar los comandos de Rails a través de la línea de comandos para configurar rápidamente sus migraciones y modelos. En cuanto a las opciones sobre cómo desea que sus asociaciones manejen las cosas cuando una se elimina, se guarda, etc., simplemente lea la guía en la parte superior para encontrar lo que está buscando.

contestado el 23 de mayo de 12 a las 21:05

gracias ben Lo único que me confunde es la asociación HABTM que configura entre los modelos Record y Field. Estoy confundido porque estaba pensando que un registro puede tener muchos campos, pero cada campo dado pertenecería a un solo registro; en otras palabras, cuando hablamos de asociaciones, ¿estamos viendo las asociaciones desde la perspectiva de una sola instancia del registro? modelo o más generalmente a través de la perspectiva de la clase de cada modelo? (Espero que tenga sentido). - a la salida

Por supuesto. Si desea que un campo sea único para cada registro, entonces cada campo pertenece_a un registro y un registro tiene_muchos campos. Por alguna razón, pensé que quería que cada Campo posiblemente estuviera conectado a diferentes Registros. Cambiar esto no afectará la configuración de la etiqueta de ninguna manera, ya que todavía se pueden conectar a muchos campos diferentes, a pesar de que esos campos son únicos para un registro. Espero que esto ayude. - Benjamin

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