Ruby on rails 具有父类别Id的Rails5类别位于同一表上

Ruby on rails 具有父类别Id的Rails5类别位于同一表上,ruby-on-rails,activerecord,model,ruby-on-rails-5,Ruby On Rails,Activerecord,Model,Ruby On Rails 5,好的,我对类别所做的是,我有两个表类别(id,name)和子类别(id,name,category_id),它们通过模型相互关联。我设置了的逆_,如下所示。 我的问题是,几年前当我用PHP编写代码时,我们使用一个表“Categories”,它有id、name、parent_id(默认为0),然后我们使用该表来控制导航、面包屑和其他导航元素的输出 class CreateCategories < ActiveRecord::Migration[5.1] def change cr

好的,我对类别所做的是,我有两个表类别(id,name)和子类别(id,name,category_id),它们通过模型相互关联。我设置了的逆_,如下所示。 我的问题是,几年前当我用PHP编写代码时,我们使用一个表“Categories”,它有id、name、parent_id(默认为0),然后我们使用该表来控制导航、面包屑和其他导航元素的输出

class CreateCategories < ActiveRecord::Migration[5.1]
  def change
    create_table :categories do |t|
      t.string :name

      t.timestamps
    end
  end
end

class CreateSubCategories < ActiveRecord::Migration[5.1]
  def change
    create_table :sub_categories do |t|
      t.string :name
      t.integer :category_id
      t.timestamps
    end
  end
end

class Category < ApplicationRecord
  has_many :sub_categories, inverse_of: :category
end
class SubCategory < ApplicationRecord
  belongs_to :categories, inverse_of: :sub_category
end
class-CreateCategories
我已经用RubyonRails编程4年多了,我还没有找到一个真正好的“Rubyway”来实现这一点。多年来,我看到过使用2表方法的例子,但这似乎不是很直观,因为当系统获得许多类别和子类别(如100)时,页面加载时间将在处理过程中受到影响。是否有人使用或知道类似的单表方法

class CreateCategories < ActiveRecord::Migration[5.1]   def change
    create_table :categories do |t|
      t.string :name
      t.integer :parent_id
      t.timestamps
    end   
  end 
end
class-CreateCategories

我一直面临的问题是模型以及如何让系统认识到一条记录可以属于同一个表中的一条记录。我已经能够手动实现它,但我还没有找到一种方法来设置它,formtastic和其他gem(如rails admin)可以很好地使用它。

似乎您正在寻找一个树结构。已经有一段时间了。如果您使用的是PostgreSQL,那么
ltree
扩展(以及gem)可能也会引起人们的兴趣。

是的,树结构是我经常遇到的另一种东西,但它仍然不能以干净的方式解决问题。依我看,这只是一个过于复杂的解决方案,应该相对简单。我正在研究循环遍历记录,构建一个数组,并根据父id进行组织,并在适当的情况下进行嵌套。在PHP和其他web语言中,您只需执行嵌套循环3 deep即可输出结果,但在ruby中,使用activerecord似乎从来没有这么简单。了解ruby的相关知识后,应该有一种更优雅的编程方式来实现这一点。如果您使用的是PostgreSQL,那么是的,这实际上是一个不错的解决方案,然而,它对我们毫无帮助。然而,一旦我解决了这个问题,我将发布答案,因为这是我多年来经常遇到的问题,我认为是时候有一个可行的答案了。使用PostgreSQL+ltree不是这里提供的唯一选项
acts_as_tree
使用一个简单的字符串列和ruby代码来完成其余部分,这与DB无关。投票失败的原因是什么?任何反对票都应该包括一个理由。