【问题标题】:Calculate quantity based on one Category attribute in Active Admin Dashboard (Rails 3.2/ active-admin 1.0)根据 Active Admin Dashboard (Rails 3.2/ active-admin 1.0) 中的一个类别属性计算数量
【发布时间】:2013-11-23 12:09:51
【问题描述】:

我正在构建一个日常交易应用程序来学习 Ruby on Rails。

我的基本模型是:

  • 交易

  • 代理机构(宣传交易的机构)。

Agencies 的属性之一是“agency_type”,我按类型(广告代理、数字代理...)对它们进行分类。

一笔交易属于_一个代理机构,而代理机构有_许多交易

我想做的是在 Active Admin 的管理界面上放置一个非常基本的表格,根据交易数量给出“顶级代理机构”。

不幸的是,在我的活跃管理员表中,我无法“合并”各种实体。您可以在下图中看到问题:

你可以在第一行看到问题:

  • 之所以这样,是因为有一个名为“Agency A”的机构,目前没有任何交易,但属于“广告机构”类型

  • 第二行:另一个代理商,“代理商 B”目前有 2 笔交易,也是“广告代理商”类型

我希望 rails 和 active admin 做的是将它们相加并将它们合并到 1 行“广告代理”中。我该怎么做?

这是我的代码:

column do
    panel "Top Type of Agencies" do
      table_for Agency.order('created_at desc').limit(10) do
        column ("Agency Type"), :agency_type 
        column ("NB of deals") do |agency_type|
          agency_type.deals.count 
        end
      end
    end    
  end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 activeadmin


    【解决方案1】:

    有两种方法可以做到这一点。在纯红宝石中:

    # (this is a bad idea)
    

    或使用 SQL:

    data = Agency.joins('left outer join deals on deals.agency_id = agencies.id').
      select('agencies.agency_type, count(deals.id) as deals_count').group 'agency_type'
    
    panel "Top Agency Types" do
      table_for data do
        column :agency_type
        column '# of Deals', :deals_count
      end
    end
    

    【讨论】:

    • 非常感谢。我是新手,你能详细说明为什么用纯红宝石制作它是个坏主意吗?那会是什么:-)
    • 进一步:我可以像您直接在活动管理文件 admin/agency.rb 中那样放入 SQL 代码吗?
    • 在纯 Ruby 中这样做很糟糕,因为您的数据库比 Ruby 和 Rails 快得多。
    • 您可以将我的代码直接放在column 块中。或者,您可以定义一个包含此行为的类级别方法,例如 Agency.deal_count_by_agency_type
    【解决方案2】:

    免责声明:未经测试

    为了在活动管理员中遍历代理类型,您应该使用不同的代理类型模型。

    #agency.rb
    has_one :agency_type
    def count_deals_by_agency_type(agency_type)
       where(:agency_type_id => agency_type).deals.count
    end
    

    在活动管理员中

    column do
        panel "Top Type of Agencies" do
          table_for AgencyType.all do |agency_type|
            column ("Agency Type"), agency_type.name
            column ("NB of deals"), Agency.count_deals_by_agency_type(agency_type.id) 
          end
        end    
     end
    

    【讨论】:

    • 谢谢,但我希望在不创建新模型的情况下这样做(我已经太多了)。 .group(:xxx).count 可能...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多