如何使用产品/广告为多个类别和子类别建立有效记录关联

时间:2015-09-22 12:25:39

标签: ruby-on-rails activerecord associations

我正在尝试了解分类广告的模型设计。假设我下面有一些类别和子类别,如下所示

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。我怎么能为此做关联?

3 个答案:

答案 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