2009-07-27 2 views
1

Я создаю систему, в которой пользователь может выбрать любую комбинацию из четырех вариантов.Лучшая логика для хранения категорий изображений

Затем результаты отображаются на основе их точной комбинации.

Например, если пользователь выбрал цвет, текст и логотип. Вернутся только результаты с цветом, текстом и логотипом.

С другой стороны, я создаю «шаблоны», которые в конечном итоге будут возвращены. Каждый шаблон будет предназначен для правильного возврата, когда пользователь выбирает комбинацию, соответствующую шаблону.

Мой вопрос:

Что такое лучший способ классифицировать эту информацию на заднем конце, так что может быть вытянут по запросам пользователей?

Например, у меня есть шаблон, который может быть цветом и текстом ИЛИ цветом, текстом и логотипом. Моя догадка состоит из двух групп этих двух в семье, а затем, когда создается комбинация, запрос проверяет каждую семью для соответствующего комбо; если true, возвращается конкретное комбинированное изменение.

Вы бы сделали это по-другому?

Спасибо!

+0

выглядит как система тегов для меня. – palindrom

ответ

2

Вы shoudn't жёстки количества доступных категорий (что, если завтра вам нужна другая категория?)

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 

...

Недостаток этого подхода является то, что вы должны иметь соответствие таблица (категории-комбинации).

1

Это довольно сложное описание проблемы. У меня небольшая проблема с анализом некоторых из них - например. «когда делается комбинация» - при отсутствии реальной вещи, на которую можно смотреть. (И что это связано с хранением изображений?)

Это говорит ... Я бы сказал, что самый простой подход - это обработать ваш поиск как задачу Rails, а не задачу данных. Просто установите любые атрибуты вам нужно для шаблона модели:

# 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 

Затем в модель, набор именованных областей для различных вариантов:

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 

Тогда вы можете просто приковать их вместе, чтобы соответствовать независимо от пользователь проверял их поиск, например Template.with_color.with_text.with_logo, и вы получите все, что сохранится в конце фильтрации с именованным пространством.

Это имеет смысл? Именованные области очень удобны для такого рода вещей - вы можете захотеть в Google на них, если раньше не сталкивались с ними.

Смежные вопросы