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。
此过程有四个基本步骤:
- 在数据库中设置关系。
- 在Rails中设置关系。
- 配置 ActiveScaffold,让它知道你想做什么。
- 添加一个属性到child模型,returns您要显示的数据。
这是一个演练:
确认您有一个适用于 child 的简单 ActiveScaffold 视图。该过程超出了本答案的范围,但请参阅 the AS wiki 了解一些简单的说明。
在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
在 parent class 中添加 has_many *child object symbol plural form*
在我们的示例中,这将是:
class Customer < ActiveRecord::Base
has_many :orders
end
在 child class 中,添加 belongs_to *parent object symbol singular form*
同样在我们的示例中,这导致:
class Order < ActiveRecord::Base
belongs_to :target_group
. . .
end
在 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
为了加快速度,告诉 ActiveScaffold 尽快加载 parent table 数据。在我们的示例中,这导致 child 控制器的 ActiveScaffold 配置区域添加以下内容:
config.columns[:customer_name].includes = :customer]
在您的 child 模型中添加一个函数,其名称与您添加到 ActiveScaffold 列数组的新列名称完全相同。在此函数中,键入末尾带点的相关 class/table 名称,然后键入您要实际显示的 property/column 名称。在示例中,这看起来像:
def customer_name
customer.full_name
end
点击 child class/table 的 ActiveScaffold 索引视图。您的价值现在应该就位了。
我在 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。
此过程有四个基本步骤:
- 在数据库中设置关系。
- 在Rails中设置关系。
- 配置 ActiveScaffold,让它知道你想做什么。
- 添加一个属性到child模型,returns您要显示的数据。
这是一个演练:
确认您有一个适用于 child 的简单 ActiveScaffold 视图。该过程超出了本答案的范围,但请参阅 the AS wiki 了解一些简单的说明。
在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
在 parent class 中添加
has_many *child object symbol plural form*
在我们的示例中,这将是:class Customer < ActiveRecord::Base has_many :orders end
在 child class 中,添加
belongs_to *parent object symbol singular form*
同样在我们的示例中,这导致:class Order < ActiveRecord::Base belongs_to :target_group . . . end
在 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
为了加快速度,告诉 ActiveScaffold 尽快加载 parent table 数据。在我们的示例中,这导致 child 控制器的 ActiveScaffold 配置区域添加以下内容:
config.columns[:customer_name].includes = :customer]
在您的 child 模型中添加一个函数,其名称与您添加到 ActiveScaffold 列数组的新列名称完全相同。在此函数中,键入末尾带点的相关 class/table 名称,然后键入您要实际显示的 property/column 名称。在示例中,这看起来像:
def customer_name customer.full_name end
点击 child class/table 的 ActiveScaffold 索引视图。您的价值现在应该就位了。