1

这可能是非常简单的事情,但我正在寻找按标签检索所有产品的最佳方式,可以这么说。这是 Spree,所以我应该坚持他们对数据建模的方式。它实际上是ProductTaxon(如类别、品牌等)

因此,如果 Producthas_and_belongs_to_many :taxons和 Taxon has_and_belongs_to_many :products,按分类查找所有产品的最佳方法是什么?

就像是:

@taxon = Taxon.find_by_permalink('categories/')
@products = Product.find_by_taxon(@taxon)

...但我不确定最后一种方法是什么(只是组成了名称)。

4

5 回答 5

2

可能你会简单地说如果只有一个分类单元

@products = @taxon.products

如果有多个,我们需要稍微不同的方法。但即使那样你也可以

@products = @taxons.inject([]) {|taxon| taxon.products}
于 2010-01-14T00:10:00.207 回答
2
@taxon = Taxon.find_by_permalink('categories', :include => :products) 

这将预先加载产品,以便您可以通过

@taxon.products

没有它再次击中数据库。这是仅使用 .products 的更有效形式,可避免 N+1 查询问题。

于 2010-01-14T00:19:22.190 回答
0

不够Taxon.find_by_permalink('categories/').products吗?

编辑:哦,对于多个分类单元,你可以尝试这样的事情:

Product.find(:all, :include => :products_taxons, :conditions => { :products_taxons => {:taxon_id => [1,2,3]} }) # will find products with taxons with id 1, 2 or 3
于 2010-01-14T00:09:10.527 回答
0

通过以下自定义,我能够在 Spree 2.1.0.beta 中使用它:

基于此处的答案:在另一个表中查找具有两个特定记录的记录

我在 /app/models/spree/product_decorator.rb 中添加了一个新的产品范围

Spree::Product.class_eval do
  add_search_scope :in_all_taxons do |*taxons|
    taxons = get_taxons(taxons)
    id = arel_table[:id]
    joins(:taxons).where(spree_taxons: { id: taxons }).group(id).having(id.count.eq(taxons.size))
  end
end

然后通过将新范围添加到 /app/models/spree/base_decorator.rb 来使用它

Spree::Core::Search::Base.class_eval do
    def get_base_scope
      base_scope = Spree::Product.active
      base_scope = base_scope.in_all_taxons(taxon) unless taxon.blank?
      base_scope = get_products_conditions_for(base_scope, keywords)
      base_scope = add_search_scopes(base_scope)
      base_scope
    end
end

现在我可以使用标准搜索助手来检索产品(这意味着我仍然可以提供关键字等以及多个分类单元):

# taxon_ids is an array of taxon ids
@searcher = build_searcher(params.merge(:taxon => taxon_ids))
@products = @searcher.retrieve_products

这对我有用,感觉很轻松。但是,我愿意接受更好的选择。

于 2013-08-08T06:33:52.770 回答
0

如果您想通过标签查找产品,您可以使用tagged_with

例子

Spree::Product.tagged_with("example")

将返回带有“示例”标签的产品

来源:https ://github.com/mbleigh/acts-as-taggable-on

于 2017-01-25T02:46:13.343 回答