开发者

How to represent dynamically derived data? (model without a table?)

开发者 https://www.devze.com 2023-03-09 04:26 出处:网络
I have tables for salespeople, products, and sales_activities (consider these to be \'transactions\', but Rails reserves that name, so I\'m calling them sales_activities).

I have tables for salespeople, products, and sales_activities (consider these to be 'transactions', but Rails reserves that name, so I'm calling them sales_activities).

For each salesperson, I need to dynamically derive their sales_total for a given day.

To do this, I run through the list of sales_activities, and create my derived content list (as an array of objects that hold salesperson_id & sales_total). I then want to display it in a view somewhat equivalent to an 'index' view of salespeople, but this view does not correspond to any of the existing index views I already have, due to the extra field (sales_total).

My question is how do I best de开发者_Go百科fine the class (or whatever) for each instance of my dynamically derived data (salesperson_id + sales_total)? It seems I could use a model without a table (with columns salesperson_id and the derived sales_total). That way, I could build an array of instances of these types as I generate the dynamic content, and then hand off the resulting array to the corresponding index view. However, from reading around, this doesn't seem 'the Rails way'.

I'd really appreciate advice on how to tackle this. The examples I've seen only show cases where a single overall total is required in the index view, and not dynamic content per row that can't be derived by a simple 'sum' or equivalent.

[This is a simplified explanation of the actual problem I'm trying to solve, so I'd appreciate help with the 'dynamically derived view / model without table' problem, rather than a short-cut answer to the simplified problem outlined above, thanks]


Maybe a plain Ruby class would do the trick?

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

in the view:

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

However like mischa said in the comments this could equally be achieved using a method on 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

Note: date_range can be a single date or a range e.g (Date.today-7.days)..Date.today

0

精彩评论

暂无评论...
验证码 换一张
取 消