主动管理重构

Active Admin refactoring

我目前正在 Active Admin 中为我的产品订单(和相关模型)创建一个仪表板。我想在此 table 中显示来自多个模型的数据,结果 table 重复得可怕。我对 Active Admin 不是很在行,希望得到一些关于重构此代码的建议:

#dashboard.rb

section "Your tasks for this week" do
    table_for Order.all do
        column "Order ID",     :id
        column "Status" do |order|
            order.order_status.name
        end
        column "Email" do |order|
            order.customer_info.email
        end
        column "Name" do |order|
            order.customer_info.name
        end
        column "Address" do |order|
            order.customer_info.address
        end
        column "City" do |order|
            order.customer_info.city
        end
        column "State/Province" do |order|
            order.customer_info.province
        end
        column "Postal Code" do |order|
            order.customer_info.postal
        end
        column "Country" do |order|
            order.customer_info.country
        end
        column "Bagel" do |order|
            order.order_items.each do |oi|
                li oi.bagel_type
            end
        end
        column "Topping1" do |order|
            order.order_items.each do |oi|
                li oi.topping1
            end
        end
        column "Topping2" do |order|
            order.order_items.each do |oi|
                li oi.topping2
            end
        end
        column "Topping3" do |order|
            order.order_items.each do |oi|
                li oi.topping3
            end
        end
        column "Open" do |order|
            order.order_items.each do |oi|
                li oi.open
            end
        end
    end
end

为了向您提供有关我的模型和关联的更多信息,有一个 Order 模型,其中 has_many order_itemshas_one customer_infoorder_itemscustomer_info 都属于 Order.

我认为不需要重构 - 您拥有的是可读易懂的代码。 但是,如果您仍然想要,您可以使用一些元编程。

比如这段代码:

  column "Email" do |order|
    order.customer_info.email
  end
  column "Name" do |order|
    order.customer_info.name
  end
  column "Address" do |order|
    order.customer_info.address
  end
  column "City" do |order|
    order.customer_info.city
  end

可以变成这样短:

  %w(Email Name Address City).each do |title|
    column title do |order|
      order.customer_info.send("#{title.downcase}")
    end
  end