【问题标题】:How to make active record association for multiple categories and sub-categories with products/ads如何使多个类别和子类别与产品/广告的活动记录关联
【发布时间】:2015-09-22 12:25:38
【问题描述】:

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

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。我该如何为此做关联?

【问题讨论】:

    标签: ruby-on-rails activerecord associations


    【解决方案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 关联基础指南。它包含所有相关信息,可帮助您轻松设置模型和关联。

    【讨论】:

    • 一个广告只能属于一个类别或子类别...我还应该使用 has_and_belongs_to_many 吗?
    • 没有。在这种情况下,您可以在 ads 表中拥有 category_id。我会更新答案。
    【解决方案2】:

    首先,对于树结构数据,您可以使用awesome_nested_set 或其他。在那里你可以用你的数据结构做很多漂亮的事情,像这样(对 DB 的单个查询):

    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: '{}'
    

    【讨论】:

      【解决方案3】:

      为同一个模型设置父子关系

      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
      

      【讨论】:

        猜你喜欢
        • 2021-09-13
        • 1970-01-01
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-15
        • 1970-01-01
        • 2021-01-11
        相关资源
        最近更新 更多