存储图像类别的最佳逻辑

时间:2009-07-27 15:03:44

标签: ruby-on-rails flex weblogic logic

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

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

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

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

我的问题:

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

例如,我有一个模板,可以是颜色和文字或颜色,文字和徽标。我的猜测是这两个家庭中的两个组,然后当组合时,查询检查每个家庭的匹配组合;如果为true,则返回该特定组合变体。

你会以不同的方式做到这一点吗?

谢谢!

2 个答案:

答案 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并且您将获得在命名范围过滤结束时幸存的任何内容。

这有意义吗?命名范围对于这类事情非常方便 - 如果您之前没有遇到它们,可能需要谷歌。