【发布时间】:2014-12-15 03:24:29
【问题描述】:
我有一个递归树结构来处理我的类别。每个叶类别可以有零个或多个交易。类别由
定义class Category < ActiveRecord::Base
has_many :sub_categories, class_name: "Category", foreign_key: "parent_category_id"
belongs_to :parent_category, class_name: "Category"
has_many :deal_categories
has_many :deals, through: :deal_categories
def leaf?
!has_sub_categories?
end
def has_sub_categories?
!sub_categories.empty?
end
end
Deals 和 DealCategories 如下所示:
class Deal < ActiveRecord::Base
has_many :deal_categories
has_many :categories, through: :deal_categories
end
class DealCategory < ActiveRecord::Base
belongs_to :deal
belongs_to :category
end
还有一些验证可以确保只有Deals可以作为叶类别存在。因此,如果我在叶节点上调用category.deals,我会得到一些交易,如果我在根节点上调用它,我会得到一个空结果。都很好。
但是现在我希望category.deals 返回它的子节点的交易,如果它不是根节点的话。我的方法是在我的Category 类中重写以下方法,如下所示:
alias_method :original_deals, :deals
def deals
if leaf?
self.original_deals
else
self.sub_categories.deals
end
end
但这不起作用,因为我不能直接在 sub_categories 上调用 deals,错误是
undefined method `deals' for #<Category::ActiveRecord_Associations_CollectionProxy:0x00000009243d40>
我该如何解决这个问题?
【问题讨论】:
标签: ruby-on-rails-4 tree overriding getter recursive-datastructures