2009-07-27 8 views
1

Ich erstelle ein System, wo ein Benutzer eine beliebige Kombination von vier Optionen auswählen kann.Beste Logik zum Speichern von Kategorien von Bildern

Dann werden die Ergebnisse basierend auf ihrer genauen Kombination angezeigt.

Zum Beispiel, wenn ein Benutzer Farbe, Text und Logo auswählt. Nur Ergebnisse mit Farbe, Text und Logo würden zurückkehren.

Auf der anderen Seite, ich erstelle "Vorlagen", die schließlich die Ergebnisse zurückgegeben werden. Jede Vorlage wird so gekennzeichnet, dass sie ordnungsgemäß zurückgegeben werden kann, wenn ein Benutzer eine Kombination auswählt, die der Vorlage entspricht.

Meine Frage:

Was ist der beste Weg, um diese Informationen in dem Back-End zu kategorisieren, so dass es von den Benutzeranforderungen gezogen werden kann?

Zum Beispiel habe ich eine Vorlage, die Farbe und Text oder Farbe, Text und Logo sein kann. Meine Vermutung ist, dass diese beiden Gruppen in einer Familie gruppiert werden, und wenn eine Kombination erstellt wird, überprüft eine Abfrage jede Familie auf eine passende Kombination. Wenn dies der Fall ist, wird diese spezifische Comboveränderung zurückgegeben.

Würden Sie es anders machen?

Danke!

+0

sieht für mich wie ein Tag-System aus. – palindrom

Antwort

2

Sie shoudn't die Anzahl der verfügbaren Kategorien codieren (was ist, wenn Sie morgen eine andere Kategorie brauchen?)

Combination 
    has_many :categories 
    belongs_to :template 

    def self.find_by_selected_categories(array_of_categories) 
    self.find(:first, :conditions => {:categories => array_of_categories}) 
    end 
end 

Template 
    has_many: combinations 
end 

...

Der Nachteil dieses Ansatzes ist, dass Sie eine Entsprechung haben muss Tabelle (Kategorien-Kombinationen).

1

Dies ist eine ziemlich komplizierte Problembeschreibung. Ich habe ein wenig Mühe, etwas davon zu analysieren - z. "Wenn eine Kombination gemacht wird" - in Ermangelung einer realen Sache zu betrachten. (Und was hat es mit dem Speichern von Bildern zu tun? Sind Ihre Vorlagen Bilder?)

Das sagte ... Ich würde sagen, der einfachste Ansatz besteht darin, Ihre Suche als eine Rails-Aufgabe statt eine Datenaufgabe zu behandeln. Einfach gesetzt, was Attribute, die Sie für Ihre Template-Modell benötigen:

# In the migration 
create_table templates do |t| 
    t.string :color # Set a validation for your hex codes, or whatever, in Rails 
    t.string :text 
    t.string :logo_file_name # These all assume you're using the Paperclip gem. 
    t.string :logo_content_type # (http://thoughtbot.com/projects/paperclip) 
    t.integer :logo_file_size # If you're tracking your logo attachment some other 
    t.datetime :logo_updated_at # way, do whatever's needed in that case. 
end 

Dann wird in dem Modell, Scopes für die verschiedenen Optionen einstellen:

class Template < ActiveRecord::Base 
    has_attached_file :logo 

    named_scope :with_color, :conditions => {"color is not null"} 
    named_scope :with_text, :conditions => {"text is not null"} 
    named_scope :with_logo, :conditions => {"logo_file_name is not null"} 
    # You could add :without_ named scopes too, of course, if you needed them 
end 

Dann können Sie einfach verketten sie zusammen bei jedem passen Benutzer überprüft in ihrer Suche, z Template.with_color.with_text.with_logo und Sie erhalten, was am Ende der genannten Scope-Filterung überlebt.

Macht das Sinn? Benannte Bereiche sind sehr praktisch für diese Art von Dingen - Sie möchten vielleicht Google auf ihnen, wenn Sie nicht schon einmal auf sie stoßen.

Verwandte Themen