2009-07-27 10 views
1

Je crée un système dans lequel un utilisateur peut sélectionner n'importe quelle combinaison de quatre options. Ensuite, les résultats sont affichés en fonction de leur combinaison exacte.Meilleure logique pour stocker des catégories d'images

Par exemple, si un utilisateur a choisi la couleur, le texte et le logo. Seuls les résultats contenant la couleur, le texte et le logo reviendront. De l'autre côté, je crée des "templates" qui finiront par être les résultats retournés. Chaque modèle sera affecté pour pouvoir retourner correctement lorsqu'un utilisateur sélectionne une combinaison qui correspond au modèle.

Ma question:

Quelle est la meilleure façon de classer ces informations dans l'arrière-plan afin qu'il puisse être tiré par les demandes des utilisateurs? Par exemple, j'ai un modèle qui peut être couleur et texte OU couleur, texte et logo. Ma conjecture est deux groupe ces deux dans une famille, et puis quand une combinaison est faite, une requête examine chaque famille pour un combo correspondant; si vrai, cette variation de combo spécifique est renvoyée.

Le feriez-vous différemment?

Merci!

+0

ressemble à un système de balise pour moi. – palindrom

Répondre

2

Vous shoudn't le nombre de coder en dur catégories disponibles (si demain vous avez besoin d'une autre catégorie?)

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 

...

L'inconvénient de cette approche est que vous devez avoir une correspondance table (catégories-combinaisons).

1

Il s'agit d'une description de problème assez compliquée. J'ai un peu de mal à en analyser certaines parties - p. "quand une combinaison est faite" - en l'absence d'une chose réelle à regarder. Cela étant dit ... Je dirais que l'approche la plus simple consiste à gérer votre recherche en tant que tâche Rails plutôt que d'une tâche de données. Il suffit de définir ce que vous les attributs besoin pour votre modèle de modèle:

# 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 

Ensuite, dans le modèle, définissez les étendues nommées pour les différentes options:

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 

Ensuite, vous pouvez simplement les enchaîner ensemble pour correspondre quel que soit le utilisateur vérifié dans sa recherche, par exemple Template.with_color.with_text.with_logo et vous obtiendrez ce qui survit à la fin du filtrage de portée nommé.

Est-ce que cela a du sens? Les portées nommées sont très pratiques pour ce genre de chose - vous pouvez vouloir Google sur eux si vous ne les avez jamais rencontrés auparavant.

Questions connexes