2016-06-01 4 views
0

Ich frage mich, wie man am besten einige Rails-Modelle so strukturiert, dass sie eine variierende Anzahl von Eingabefeldern unterstützen können.Rails-Modellstruktur zur Unterstützung von Objekten mit unterschiedlicher Anzahl von Feldern

Sagen wir, dass ich ein Artikelmodell habe, das zu einem Themenmodell gehört. Ich möchte eine beliebige Anzahl von Themen haben und jedem Thema erlauben, seine eigenen Felder zu definieren. Zum Beispiel könnte theme_1 primary_colour definieren und theme_2 könnte colour_1, colour_2 und font definieren.

Im Wesentlichen bestimmt die Wahl des Themas, welche zusätzlichen Informationen gesammelt werden müssen, damit der Artikel das Thema richtig anwenden kann.

Wenn Artikel_1 theme_1 verwendet, muss ich einen Wert für primary_color speichern, wenn ich artikel_1 rende. Wenn Artikel_2 auch theme_1 verwendet, möchte ich einen anderen Wert für primary_color definieren können. Wenn article_3 theme_2 verwendet, muss ich außerdem color_1, color_2 und font speichern.

Die Themen definieren die erforderlichen Felder, die erforderlichen Werte würden für den Artikel eindeutig sein.

Bisher habe ich mit den folgenden aber ich bin nicht sicher, seine beste Lösung zu kommen:

class Article < ActiveRecord::Base 
    belongs_to :theme 
    has_many :article_details 
end 

class Theme < ActiveRecord::Base 
    has_many :fields 
end 

class ArticleDetail < ActiveRecord::Base 
    belongs_to :field 
    belongs_to :listing 
end 

Der Artikel hat ein Thema und ein Thema hat Felder, damit ich weiß, welche Felder ich für die füllen brauchen Artikel. Artikel haben auch article_details, wo ich einen Wert und einen Verweis auf das Feld speichern, für das der Wert bestimmt ist.

Ich hoffe, ich habe die Beschreibung klar gemacht. Jede Rückmeldung wird geschätzt.

Dank

+0

Es gibt viele Möglichkeiten, dies zu erreichen. Die beste Wahl hängt hauptsächlich ab von: 1. Wieviele Themen haben Sie sich vorzustellen? 2. Wie planen Sie den Zugriff auf oder die Aktualisierung Ihrer Themen (speziell, müssen Sie alle Artikel mit Primärfarbe blau finden, oder einen Artikel gegeben, tun Sie müssen nur herausfinden, was das Thema ist?) – Julie

+0

@Julie - Um der Argumentation halber sagen wir 5-15 Themen, aber ich wollte die Dinge auseinander brechen, um Thema Flexibilität nicht zu begrenzen. Ich sehe nicht voraus, alle Artikel mit Primärfarbe blau zu finden. Ich möchte das Thema einfach "anwenden" können. Also, wenn Artikel_1 primary_color blau hat, könnte ich css für theme_1 haben, wo ich eine primary_color-Variable angeben möchte. – adampetrie

Antwort

0

Da es mehr als eine Handvoll möglicher Themen ist, und dass Sie nicht vorhaben, Anfragen Updates zu tun, basierend auf den Feldern erforderlich ist, würde ich empfehlen, eine Hash-Spalte. So etwas wie folgt aus:

class Article < ActiveRecord::Base # Columns on the articles table include: # Indexed string called 'theme' # text column (not string!) called 'fields' serialize :fields
end

Dann werden Sie in der Lage sein, etwas zu tun: a = Article.new a.fields = {color1: 'blue', color2: 'red', fontFamily: 'Verdana'} a.save

+0

Danke für die Antwort. Wenn ich mit dieser Route gehe, würde ich meine Fähigkeit einschränken, die Felder abzufragen, sollte es notwendig sein. Ich frage mich, ob ich die Themen als eine polymorphe Assoziation auf den Artikeln einrichten könnte. Artikel hat ein Thema durch ArticleTheme oder etwas ähnliches? – adampetrie

0

Ich glaube, ich war diese Lösung über denken.

class CreateArticles < ActiveRecord::Migration 
    def change 
    create_table :articles do |t| 
     t.references :theme, polymorphic: true, index: true 
    end 
    end 
end 

class Article < ActiveRecord::Base 
    belongs_to :theme, polymorphic: true 
end 

class MyTheme < ActiveRecord::Base 
    has_one :article 
end 

An diesem Punkt, wenn MyTheme definiert primary_color ich etwas tun kann: Wenn Artikel eine polymorphe Vereinigung über ein Thema hat, dann könnte ich n Themen jeweils mit einem eigenen Satz von Feldern definiert

article = Article.new 
article.theme = MyTheme.new(primary_color: 'blue') 
article.save 
article.theme.primary_color 
=> 'blue' 

Was vorläufig sowieso das befriedigt, wonach ich gesucht habe.

Verwandte Themen