如何表示动态派生的数据? (没有桌子的模特?)

时间:2011-05-31 08:32:11

标签: ruby-on-rails

我有销售人员产品 sales_activities 的表格(将这些视为“交易”,但Rails保留该名称,因此我称之为sales_activities)。

对于每个销售人员,我需要动态地派生他们在给定日期的sales_total。

为此,我浏览 sales_activities 列表,并创建我的派生内容列表(作为包含salesperson_id& sales_total的对象数组)。然后我想在一个与销售人员的“索引”视图相对应的视图中显示它,但是这个视图与我已有的任何现有索引视图都不对应,因为有额外的字段( sales_total)。

我的问题是如何为动态派生数据的每个实例(salesperson_id + sales_total)最好地定义类(或其他)?看来我可以使用没有表的模型(列salesperson_id和派生的sales_total)。这样,我可以在生成动态内容时构建这些类型的实例数组,然后将生成的数组移交给相应的索引视图。然而,从阅读中看,这似乎并不是“Rails方式”。

我真的很感激如何解决这个问题的建议。我看过的例子只显示了索引视图中需要单个总计的情况,而不是每行的动态内容,而这些内容不能通过简单的“总和”或等价来推导。

[这是我正在尝试解决的实际问题的简化说明,所以我很感激帮助'动态导出的视图/模型没有表'问题,而不是对简化问题的简短回答上面概述,谢谢]

1 个答案:

答案 0 :(得分:0)

也许一个普通的Ruby类可以做到这一点?

class SalesStats
  def initialize(sales_person, date_range = Date.today)
    @sales_person = sales_person
    @date_range = date_range
  end

  def results
    # return a array or hash (anything which responds to an 'each' method), e.g:
    SalesActivity.find(:all, :conditions => { :sales_person => @sales_person, :created_at => @date_range }).group_by(&:sales_person).collect { |person, sales_activities| { :person => person, :total => sales_activities.sum(&:price) } }        
  end
end

在视图中:

<% @sales_stats.results.each do | stat | %>
 <%= stat[:person] %> - <%= stat[:total] %>
<% end %>

然而,像mischa在评论中所说,使用SalePerson上的方法同样可以实现:

class SalesPerson < AR::Base
  has_many :sales_activities

  def total_sales(date_range)
    sales_activities.find(:all, :conditions => { :created_at => date_range }).collect { ... }
  end
end

注意:date_range可以是单个日期或范围,例如(Date.today-7.days).. Date.today