Ruby on rails 如何在rails中存储用户选择的特定类别和子类别

Ruby on rails 如何在rails中存储用户选择的特定类别和子类别,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我有一个问题,如果有人能帮助我,我将不胜感激。我正在从事一个项目,该项目有一个类别和子类别表,这两个表之间的关联如下 类别

我有一个问题,如果有人能帮助我,我将不胜感激。我正在从事一个项目,该项目有一个类别和子类别表,这两个表之间的关联如下

类别
还有一个用户表,用户可以选择多个类别及其子类别并存储在另一个数据库表中。我已经创建了UserCategory模型,并将该用户模型与该模型关联以存储类别ID

class用户true
结束
类UserCategory

现在我的问题是,我如何存储子类别ID和它的父选定类别ID?因为我想在查看页面上显示单个用户选择的类别和子类别。

我将首先使用一个表,而不是两个表来显示类别和子类别:

class AddParentToCategories < ActiveRecord::Migration[6.0]
  def change
    change_table :categories do |t|
      t.references :parent, 
        foreign_key: { to_table: :categories },
        null: true
      t.string :type, index: true
    end
  end
end
然后放下桌子。您可能还希望填充“类型”列中的空值:

Category.where(type: nil).update_all(type: 'Category')
然后,可以将类修改为单个表设计:

class Category < ApplicationRecord
  # this still refers back to the categories table
  has_many :sub_categories,
    class_name: 'SubCategory',
    foreign_key: :parent_id
  scope :top_level, -> { where(parent_id: nil) }
end
实际上,ID是顶级还是子类别不再重要。这里不需要嵌套属性。只有当您想向联接表中添加两个外键列之外的其他列时,才需要这样做

通常,您可以通过收集帮助程序执行此操作:

<%= f.grouped_collection_select :category_ids, @categories, :sub_categories, :name, :id, :name %>


用户可以选择一个类别而不选择该类别中的任何子类别吗?任何用户都不能先选择子类别,用户必须先选择类别,然后才能选择类别。一般来说,您必须创建父类别和子类别的联接表行的想法是错误的。如果您有一个树形图,您可以始终从叶节点遍历到根节点。我没有问用户是否可以先选择子类别,而是问用户是否可以选择类别而不选择该类别中的子类别。是,用户可以选择类别而不选择子类别。。但我可以在用户选择其子类别时存储数据。。因为我需要子类别信息
# By inheriting from Category this model uses the table name 
# categories instead of sub_categories
class SubCategory < Category
  belongs_to :parent,
    class_name: 'Category'
end
User.create(category_ids: [1, 2, 3, 5])
<%= f.grouped_collection_select :category_ids, @categories, :sub_categories, :name, :id, :name %>