2012-05-22 4 views
0

J'ai un modèle d'enregistrement et je veux créer un modèle de champ tel qu'un enregistrement donné has_many champs. De même, je veux que chaque champ soit associé à une étiquette de sorte que chaque champ has_one Tag. Mais chaque Tag peut être réutilisé plusieurs fois entre les objets Field.Correct Association entre les modèles dans les rails 3

Dans ce cas, je voudrais juste dire qu'un champ belongs_to_many? De même serait-il juste de dire que le champ belongs_to_many Records?

(En fin de compte, je veux l'objet d'enregistrement à un conteneur pour plusieurs champs, je prévois d'avoir une forme où je peux ajouter dynamiquement nouveau champ et Tag, de sorte qu'un enregistrement pourrait ressembler à:.

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

où chaque tag peut être tiré d'une piscine préexistante ou créé à la volée) Merci pour votre aide!

Répondre

0

D'abord, je recommande fortement la lecture Guide RoR sur les associations: http://guides.rubyonrails.org/association_basics.html

Que vous soyez nouveau ou besoin d'une touche sur l'utilisation Associations RoR, lisez ce guide.

Votre question semble être plus d'une question de logique, mais je vais commencer par le code pour elle:

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 
... 

Chaque enregistrement se connecte à de nombreux domaines différents, et chaque champ se connecte à de nombreux enregistrements . Ceci est un exemple classique d'une association de plusieurs à plusieurs. La logique dans votre code lorsque vous utilisez réellement ces modèles est ce qui va faire ressembler le modèle d'enregistrement à un conteneur (car techniquement, vous pourriez dire qu'un champ est un conteneur pour de nombreux enregistrements).

Chaque champ aura 1 balise qui lui est associée, mais ce même balise peut être utilisé avec n'importe quel nombre de champs (vous pouvez dire que les champs sont en réutilisant les balises). C'est une association de un à plusieurs. Lors de cette connexion, vous utiliserez belongs_to dans le modèle Field, et has_many dans le modèle Tag.

Étant donné que Tag est connecté au Field Model, la logique que vous recherchez: Un enregistrement est un conteneur pour les champs et les balises, est logique avec cette configuration.

Voici un exemple simple d'aller chercher une étiquette à l'intérieur d'un enregistrement:

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

Record.first.fields.first.tag 

De même, on peut facilement aller dans le sens inverse:

Tag.first.fields.first.records.first 


Assurez-vous de tirer parti des commandes Rails via la ligne de commande pour configurer rapidement vos migrations et vos modèles. En ce qui concerne les options sur la façon dont vous voulez que vos associations gèrent les choses lorsqu'elles sont supprimées, sauvegardées, etc., lisez simplement le guide en haut pour trouver ce que vous cherchez.

+0

Merci Ben. La seule chose qui me rend confus est l'association HABTM que vous installez entre les modèles Record et Field. Je suis confus parce que je pensais qu'un Record peut avoir plusieurs Fields, mais chaque Field donné n'appartiendrait qu'à un seul Record - en d'autres termes quand nous parlons d'associations, voyons-nous des associations à travers la perspective d'une seule instance du modèle ou plus généralement à travers la perspective de la classe de chaque modèle? (J'espère que cela à du sens). – oort

+0

En effet.Si vous voulez qu'un champ soit unique pour chaque enregistrement, alors chaque champ appartient à un enregistrement et un enregistrement contient plusieurs champs. Pour une raison quelconque, je pensais que vous vouliez que chaque champ soit éventuellement connecté à différents records. Changer ceci n'affectera en aucune façon la configuration de Tag, car ils peuvent toujours être connectés à de nombreux champs différents, bien que ces champs soient uniques à un enregistrement. J'espère que cela t'aides. – Ben

Questions connexes