在开发一个电子商务应用程序时,我试图解决以下问题:
我的类别通过awesome_nested_set插件实现。
如果我通过选择一个类别列出我的文章,那么一切正常,但是对于某些链接,我想显示一个类别的所有产品及其子类别的产品。

这是仅适用于一种类别的 Controller 代码:

   # products_controller.rb
   def index
    if params[:category]
      @category = Category.find(params[:category])
      #@products = @category.product_list
      @products = @category.products
    else
      @category = false
      @products = Product.scoped
    end
    @products = @products.where("title like ?", "%" + params[:title] + "%") if params[:title]
    @products = @products.order("created_at).page(params[:page]).per( params[:per_page] ? params[:per_page] : 25)
    @categories = Category.all
  end

我注释掉的行是我在类别模型中编写的帮助程序方法,该方法以数组形式返回该类别及其子类别的所有乘积。

它的定义如下:
# app/models/category.rb
def product_list
  self_and_ancestors.to_a.collect! { |x| x.products }
end

现在,当我取消注释此行并尝试选择一个类别时,我的产品 Controller 代码会因错误而中断
undefined method `order' for #<Array:0x1887c2c>

或者
undefined method `page' for #<Array:0x1887c2c>

因为我使用的是排序和分页,所以无法再订购Arary。

有什么想法如何在我的 Controller 的ActiveRecord Relation元素中获取所有产品?
谢谢

更新

因此,当我使用以下命令时:
class Category < ActiveRecord::Base
    acts_as_nested_set

    attr_accessible :name, :description, :lft, :rgt, :parent_id

    has_many :categorizations
    has_many :products, :through => :categorizations

    attr_accessor :product_list

    def branch_ids
      self_and_descendants.map(&:id).uniq
    end

    def all_products
       Product.find(:all, :conditions => { :category_id => branch_ids } )
    end


end

并询问 Controller @category.all_products我得到以下错误:
Mysql::Error: Unknown column 'products.category_id' in 'where clause': SELECT `products`.* FROM `products` WHERE `products`.`category_id` IN (6, 8, 9)

我将如何获得具有这种星座的所有产品?

更新2

好吧,所以我要开始赏金。

如果我尝试:

def all_products
Categorization.find(:all,:conditions => {:category_id => branch_ids})
结尾

我再次获得undefined method订单”
我需要知道如何将many_to_many关系的所有产品作为ActiveRecord关系。

更新3

我把相关代码放在了要点上
https://gist.github.com/1211231

最佳答案

具有awesome_nested_set的键是使用 lft列中的范围。
这是我如何直接关联的代码示例(类别has_many文章)

  module Category
    extend ActiveSupport::Concern
    included do
      belongs_to :category
      scope :sorted, includes(:category).order("categories.lft, #{table_name}.position")
    end

    module ClassMethods
      def tree(category=nil)
        return scoped unless category
        scoped.includes(:category).where([
          "categories.tree_id=1 AND categories.lft BETWEEN ? AND ?",
          category.lft, category.rgt
        ])
      end
    end # ClassMethods
  end

然后在 Controller 中的某处
@category = Category.find_by_name("fruits")
@articles = Article.tree(@category)

会找到苹果,橙子,香蕉等类别下的所有文章。
您应该结合分类来适应这个想法(但是您确定在这里需要多对多关系吗?)

无论如何,我会尝试这样做:
class Product < AR
      has_many :categorizations

      def self.tree(category=nil)
        return scoped unless category
        select("distinct(products.id), products.*").
        joins(:categorizations => :category).where([
          "categories.lft BETWEEN ? AND ?", category.lft, category.rgt
        ])
      end
end

让我知道是否有陷阱

关于ruby-on-rails - 获取类别和子类别(rails,awesome_nested_set)的所有产品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7332706/

10-16 13:16