如何在Rails 4中使用自引用关联实现三级分类
纯Rails自引用关联实现三级分类的正确姿势
嘿,你的问题其实很好解决——问题出在belongs_to关联的外键配置上!
问题根源
你定义belongs_to :parent_category的时候,Rails会默认推断外键是parent_category_id,但你的数据库表中实际存储父分类ID的字段是parent_id,这就导致查询时找错了字段,自然返回nil。
正确的关联代码
只需要给belongs_to关联加上foreign_key参数,指定为parent_id就可以了:
class Category < ActiveRecord::Base belongs_to :parent_category, class_name: "Category", foreign_key: :parent_id has_many :sub_categories, class_name: "Category", foreign_key: :parent_id end
现在再执行Category.find(3).parent_category,就能正确获取到ID为2的父分类了。
扩展:获取全层级子分类
如果需要一次性获取某个分类下所有层级的子分类(比如三级的SubSub1),可以给模型加一个递归方法:
class Category < ActiveRecord::Base belongs_to :parent_category, class_name: "Category", foreign_key: :parent_id has_many :sub_categories, class_name: "Category", foreign_key: :parent_id # 递归获取所有后代分类 def all_descendants sub_categories + sub_categories.flat_map(&:all_descendants) end end
调用Category.find(1).all_descendants就能拿到Cat1下面所有的二级、三级子分类啦。
内容的提问来源于stack exchange,提问作者Ritesh Ranjan
相关产品推荐
相关产品推荐

