我正在尝试了解分类广告的模型设计。假设我下面有一些类别和子类别,如下所示
Electronics(Main category)
-Mobile
--Company
---Model
-TV
--Company
---Model
Property(Main category)
-Car(Sub category)
--Brand(Sub Sub category)
---Speed Range(Sub Sub Sub category)
我有广告模型。
如何在类别,所有子类别和广告之间建立关系。到目前为止,我已经提出了下面的设计
class MainCategoy < ActiveRecord::Base
has_many :subcategory
end
class SubCategoy < ActiveRecord::Base
has_many :subsubcategoy
belongs_to: maincategory
end
class SubSubCategoy < ActiveRecord::Base
has_many :subsubsubcategory
belongs_to: subcategory
end
class SubSubSubCategoy < ActiveRecord::Base
belongs_to: subsubcategory
end
class Ads< ActiveRecord::Base
end
现在我的问题是(1)我的不同类别和子类别的关联是否正确?如果没有,请建议什么是最好的设计。
(2)我不明白如何将广告与类别和子类别相关联。类别不一定总是具有SubSubSubCategory或SubSubCategory,但它必须具有SubCategory。我怎么能为此做关联?
答案 0 :(得分:1)
你可以使用一个自引用模型,例如:
class Category < ActiveRecord::Base
has_many :child_categories, class_name: "Category", foreign_key: "parent_category_id"
belongs_to :parent_category, class_name: "Category", foreign_key: "parent_category_id"
end
在这里,您将使用字段parent_category_id来指定父类别。这基本上会为您提供类别的树结构。
然后,您还可以轻松地将广告仅与此模型相关联。例如,如果您想要多对多关联,则可以将其添加到类别模型中:
has_and_belongs_to_many :ads
然后是广告模型:
class Ads < ActiveRecord::Base
has_and_belongs_to_many :categories
end
另请参阅http://guides.rubyonrails.org/association_basics.html有关如何设置迁移的信息。
由于一个广告只能属于一个类别,因此您可以设置如下关联:
class Category < ActiveRecord::Base
has_many :child_categories, class_name: "Category", foreign_key: "parent_category_id"
belongs_to :parent_category, class_name: "Category", foreign_key: "parent_category_id"
has_many :ads
end
class Ads < ActiveRecord::Base
belongs_to :category
end
您还应该阅读我之前链接的rails association basics指南。它包含所有相关信息,可帮助您轻松设置模型和关联。
答案 1 :(得分:0)
首先,对于树形结构数据,您可以使用awesome_nested_set或其他。在那里你可以用你的数据结构做很多很好的事情,比如这样(对数据库进行单一查询):
Category.each_with_level(Category.root.self_and_descendants) do |category, level|
...
end
对于广告,我会使用has_and_belongs_to_many关联:
class Ads< ActiveRecord::Base
has_and_belongs_to_many :categories
end
或者简单使用数组字段(Postgresql):
add_column :ads, :integer, array: true, default: '{}'
答案 2 :(得分:0)
为同一模型设置父子关系
ad:parent_id到类别
class Category < ActiveRecord::Base
belongs_to :parent, class: Category
has_many :subcategories, class: Category, foreign_key: :parent_id
has_many :subsubcategories, class: Category, through: :subcategories, source: :subcategories
has_many :ads
end