Ruby on rails ActiveScaffold显示关系值

Ruby on rails ActiveScaffold显示关系值,ruby-on-rails,ruby-on-rails-3,activerecord,rails-activerecord,activescaffold,Ruby On Rails,Ruby On Rails 3,Activerecord,Rails Activerecord,Activescaffold,我在ActiveScaffold中显示了一个简单的表。该表有三个字段:一个ID、一个描述和另一个ID,该ID是另一个表的外键。在ActiveScaffold列表视图中,我希望显示相关表中的“name”字段,而不是外键值(一个没有帮助的ID号) 我浏览了ActiveScaffold的基本文档、常见问题解答和论坛(以及进行了一次SO搜索),但运气不佳。AS API文档描述了大量与ActiveRecord关联的功能,但似乎对建立这些关系的基础知识一无所知 我怎样才能做到这一点呢?经过两天的搜索和实验,

我在ActiveScaffold中显示了一个简单的表。该表有三个字段:一个ID、一个描述和另一个ID,该ID是另一个表的外键。在ActiveScaffold列表视图中,我希望显示相关表中的“name”字段,而不是外键值(一个没有帮助的ID号)

我浏览了ActiveScaffold的基本文档、常见问题解答和论坛(以及进行了一次SO搜索),但运气不佳。AS API文档描述了大量与ActiveRecord关联的功能,但似乎对建立这些关系的基础知识一无所知


我怎样才能做到这一点呢?

经过两天的搜索和实验,我终于找到了答案。我想我会把它贴出来,以防万一这对别人有帮助

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

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

  • 子表是包含外键的表。在本例中,订单将具有Person表中的外键
  • 父表是子表关联的表。Customer表是下面示例中的父表
此过程有四个基本步骤:

  • 在数据库中设置关系
  • 在Rails中设置关系
  • 配置ActiveScaffold,以便它知道您要执行的操作
  • 向子模型添加一个属性,该属性返回要显示的数据
  • 下面是一个演练:

  • 验证是否有一个直接的ActiveScaffold视图可用于该孩子。该过程不在本答案的范围内,但请参阅以获取一些简单的说明

  • 子表中添加外键。在Rails迁移中,这需要创建表,在子表中使用外来ID字段,然后“添加外来键[child table symbol],[parent table symbol]”。在我的例子中,这是完整的迁移:

    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 object symbol singular form*
    ,同样在我们的示例中,这会导致:

    class Order < ActiveRecord::Base
      belongs_to :target_group
      . . .
    end
    
  • 为了加快速度,请告诉ActiveScaffold尽快加载父表数据。在我们的示例中,这将导致在子控制器的ActiveScaffold配置区域中添加以下内容:

    config.columns[:customer_name].includes = :customer]
    
  • 在子模型中添加一个与添加到ActiveScaffold columns数组中的新列名完全相同的函数。在该函数中,键入相关的类/表名,并在末尾加一个点,然后键入要实际显示的属性/列名。在本例中,如下所示:

    def customer_name
      customer.full_name
    end
    
  • 点击子类/表的ActiveScaffold索引视图。您的价值现在应该到位了

  • config.columns[:customer_name].includes = :customer]
    
    def customer_name
      customer.full_name
    end