ActiveScaffold 显示相关值

ActiveScaffold show relational value

我在 ActiveScaffold 中显示了一个简单的 table。 table 有三个字段:ID、描述和第二个 ID,它是另一个 table 的外键。在 ActiveScaffold 列表视图中,我想显示相关 table 中的 'name' 字段而不是外键值(无用的 ID 号)。

我查看了 ActiveScaffold 基本文档、常见问题解答和论坛(以及进行 SO 搜索),但没有成功。 AS API 文档描述了大量与 ActiveRecord 关联相关的功能,但似乎没有关于设置这些关系的基础知识。

我怎样才能做到这一点?

经过两天的搜索和实验,我终于弄明白了。以为我会 post 以防万一这对其他人有帮助。

我将在下面使用客户和订单示例(即一个客户可以有多个订单,我们希望客户的名称显示在订单的 ActiveScaffold 视图中)。数据结构故意保持非常简单。

首先是以下几个基本定义:

  • child table 就是里面有外键的table。在示例中,Orders 将具有来自 Person table.
  • 的外键
  • parent table 是由 child 关联的 table。客户 table 是下例中的 parent。

此过程有四个基本步骤:

  1. 在数据库中设置关系。
  2. 在Rails中设置关系。
  3. 配置 ActiveScaffold,让它知道你想做什么。
  4. 添加一个属性到child模型,returns您要显示的数据。

这是一个演练:

  1. 确认您有一个适用于 child 的简单 ActiveScaffold 视图。该过程超出了本答案的范围,但请参阅 the AS wiki 了解一些简单的说明。

  2. childtable中添加一个外键。在RailsMigration-speak中,这需要创建tables,在childtable中有foreign ID字段,然后“add_foreign_key [childtable符号],[parenttable符号]”中我的情况是完整迁移:

    class CustomerOrderAdd < ActiveRecord::Migration
      def change
        create_table(:customers, primary: :target_group_id) do |t|
          t.column :full_name, :string, null: false
        end
    
        create_table(:orders, primary: :order_id) do |t|
          t.column :customer_id, :int, null: false
          t.column :order_desc, :string, null: false
        end
    
        add_foreign_key :orders, :customers
      end
    end
    
  3. 在 parent class 中添加 has_many *child object symbol plural form* 在我们的示例中,这将是:

    class Customer < ActiveRecord::Base
      has_many :orders
    end
    
  4. 在 child class 中,添加 belongs_to *parent object symbol singular form* 同样在我们的示例中,这导致:

    class Order < ActiveRecord::Base
      belongs_to :target_group
      . . .
    end
    
  5. 在 child 控制器的 ActiveScaffold 配置块中,向您的 ActiveScaffold 列数组添加一列,该列将显示 parent class/table 中的相关数据。随便命名。请记住,您需要在其余步骤中使用它。在我们的示例中,这导致在列数组中添加 :customer_name

    class OrdersController < ApplicationController
      active_scaffold :order do |config|
        config.label = 'Customer Orders'
        config.list.sorting = [{customer_id: :asc}]
        config.list.per_page = 30
    
        config.columns = [:id, :order_desc, :customer_name]
    
      end
    end
    
  6. 为了加快速度,告诉 ActiveScaffold 尽快加载 parent table 数据。在我们的示例中,这导致 child 控制器的 ActiveScaffold 配置区域添加以下内容:

    config.columns[:customer_name].includes = :customer]
    
  7. 在您的 child 模型中添加一个函数,其名称与您添加到 ActiveScaffold 列数组的新列名称完全相同。在此函数中,键入末尾带点的相关 class/table 名称,然后键入您要实际显示的 property/column 名称。在示例中,这看起来像:

    def customer_name
      customer.full_name
    end
    
  8. 点击 child class/table 的 ActiveScaffold 索引视图。您的价值现在应该就位了。