gpt4 book ai didi

ruby-on-rails - 获取类别和子类别的所有产品(rails,awesome_nested_set)

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:01 26 4
gpt4 key购买 nike

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

因为我正在使用排序和分页,它不能再对数组进行排序了。

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

更新

所以,当我使用以下内容时:

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

好的,所以我要开始赏金了。

如果我尝试:

定义所有产品 Categorization.find(:all, :conditions => { :category_id => branch_ids } )结束

我再次得到 undefined methodorder' for #`我需要知道如何将多对多关系的所有乘积作为 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com