1

我正在创建一个系统,用户可以在其中选择四个选项的任意组合。

然后根据它们的精确组合显示结果。

例如,如果用户选择了颜色、文本和徽标。只有具有颜色、文本和徽标的结果才会返回。

另一方面,我正在创建最终将返回结果的“模板”。每个模板都将被指定为能够在用户选择与模板对应的组合时正确返回。

我的问题 :

在后端对这些信息进行分类以便用户请求提取它的最佳方法是什么?

例如,我有一个可以是颜色和文本或颜色、文本和徽标的模板。我的猜测是这两个在一个家庭中的两个组,然后当进行组合时,查询会审查每个家庭以寻找匹配的组合;如果为真,则返回该特定组合变体。

你会做不同的事情吗?

谢谢!

4

2 回答 2

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

...

这种方法的缺点是您必须有一个对应表(类别组合)。

于 2009-07-27T15:53:54.180 回答
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,您将获得在命名范围过滤结束时幸存的任何内容。

那有意义吗?命名范围对于这类事情非常方便——如果你以前没有遇到过它们,你可能想用谷歌搜索它们。

于 2009-07-27T15:55:01.433 回答