我正在创建一个系统,用户可以选择四种选项的任意组合。
然后根据它们的确切组合显示结果。
例如,如果用户选择了颜色,文字和徽标。只有颜色,文字和徽标的结果才会返回。
另一方面,我正在创建“模板”,最终将返回结果。当用户选择与模板对应的组合时,每个模板都将被指定为能够正确返回。
我的问题:
在后端对此信息进行分类的最佳方法是什么,以便用户可以提取这些信息?
例如,我有一个模板,可以是颜色和文字或颜色,文字和徽标。我的猜测是这两个家庭中的两个组,然后当组合时,查询检查每个家庭的匹配组合;如果为true,则返回该特定组合变体。
你会以不同的方式做到这一点吗?
谢谢!
答案 0 :(得分:2)
你不应该硬编码可用类别的数量(如果明天你需要另一个类别会怎样?)
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 :(得分: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
并且您将获得在命名范围过滤结束时幸存的任何内容。
这有意义吗?命名范围对于这类事情非常方便 - 如果您之前没有遇到它们,可能需要谷歌。