在开发一个电子商务应用程序时,我试图解决以下问题:
我的类别通过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/