【问题标题】:Rails5 Category with Parent Category Id on the same tableRails5 类别与父类别 ID 在同一张表上
【发布时间】:2017-10-23 18:34:36
【问题描述】:

好的,所以我一直在为类别做的是我有 2 个表 Categories(id, name) 和 SubCategories(id, name, category_id) 通过模型相关联。我设置了 inverse_of,如下所示。 我的问题是,当我几年前用 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

我已经在 Ruby on Rails 中编程超过 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

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

【问题讨论】:

  • 投反对票的原因是什么?任何反对票都应包含理由。

标签: ruby-on-rails activerecord model ruby-on-rails-5


【解决方案1】:

您似乎正在寻找树状结构。 acts_as_tree 已经存在了一段时间。如果您使用的是 PostgreSQL,ltree 扩展可能也很有趣(以及 pg_ltree gem)。

【讨论】:

  • 是的树结构是我经常遇到的其他东西,但它仍然不能以干净的方式解决问题。 IMO 它只是一个过于复杂的解决方案,应该相对简单。我正在考虑遍历记录并构建一个数组并根据父 ID 进行组织,并在适当的情况下进行嵌套。在 PHP 和其他 Web 语言中,您只需执行 3 深的嵌套循环即可输出结果,但在 ruby​​ 中,使用 activerecord 似乎从未如此简单。
  • 了解我对 ruby​​ 的了解后,应该有一种更优雅的方式来以编程方式处理这个问题。
  • 如果您使用的是 PostgreSQL,那么是的,这实际上是一个不错的解决方案,但是 MySQL 它什么也没做。但是,一旦我解决了这个问题,我就会发布答案,因为这是我多年来看到很多人问过的问题,我认为是时候有一个可行的答案了。
  • 使用 PostgreSQL + ltree 并不是这里提供的唯一选择。 acts_as_tree 使用简单的字符串列和 ruby​​ 代码来完成其余的工作,这与 DB 无关。
猜你喜欢
  • 2020-12-06
  • 2017-07-10
  • 1970-01-01
  • 2020-03-05
  • 2020-10-29
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
相关资源
最近更新 更多