将新符号添加到activerecord数组

时间:2014-04-03 11:50:01

标签: ruby-on-rails arrays activerecord ruby-on-rails-4

我希望能够使用新的计算字段对我的activerecord结果进行排序,但我不确定如何将新字段添加到activerecord数组。我的代码

def index 

@customers = Customer.first(2)

end

从ActiveRecord结果

返回一个数组
    [#<Customer id: 1, customer_name: "BOB", 
street: "1 Long Street", suburb: "BELMONT", state: "QLD", 
postcode: "4153", price_list_id: "AAA111">,
#<Customer id: 2, customer_name: "TONY", 
street: "1 Short Street", suburb: "BELMONT", state: "QLD", 
postcode: "4153", price_list_id: "BBB222">]

我想添加一个新的符号:revenue。此符号将是计算字段。我已经谷歌搜索了几天,似乎无法找到答案。

我只想要我的新阵列:

[#<Customer id: 1, customer_name: "BOB", 
street: "1 Long Street", suburb: "BELMONT", state: "QLD", 
postcode: "4153", price_list_id: "AAA111", revenue: "">,
#<Customer id: 2, customer_name: "TONY", 
street: "1 Short Street", suburb: "BELMONT", state: "QLD", 
postcode: "4153", price_list_id: "BBB222", revenue: "">]

非常感谢任何想法。

然后,我将使用ApplicationHelper中的帮助方法填充收入字段,如下所示:

def sum_yearly_revenue(id, year)
  sum_yearly_revenue = Sale.sum(:revenue, :conditions => ['id = ? AND financial_year = ?', id, year])
end

其中id是客户ID字段,year是“2014”。

2 个答案:

答案 0 :(得分:0)

您应该使用sort_by。类似的东西:

customers.sort_by { |c| ... }

答案 1 :(得分:0)

您无法向活动记录数组添加新字段。

您似乎正在使用服务对象 * 销售 *来计算年收入。

这与您的客户模型无关。不要混淆这两种责任。因此,请不要为此创建计算字段。

在架构上,最正确的设计是检索要在控制器中排序的客户。 接下来用服务对象对它们进行排序。

类似的东西:

class SortByYearlyRevenue   attr_reader:coll   def初始化(集合)     @coll = collection.to_a   结束   def执行(年)     coll.map {| X | [x,Sale.sum(:收入,:条件=&gt; [&#39; id =?AND financial_year =?&#39;,x.id,year])]}。sort_by {| x | X [1]}   结束 端

def index
  customers = User.first(2)
  @customers = SortByYearlyRevenue.new(customers).execute(params[:year])
  puts @customers
end

然后你应该在app / services / sort_by_yearly_revenue.rb中创建一个服务对象

class SortByYearlyRevenue
  attr_reader :coll
  def initialize(collection)
    @coll = collection.to_a
  end
  def execute(year)
    coll.map{|x| [x, Sale.sum(:revenue, :conditions => ['id = ? AND financial_year = ?', x.id, year])]}.sort_by{|x| x[1]}
  end
end

然后你不需要&#39; sum_yearly_revenue&#39;辅助方法。

在您的视图中,您将拥有一个数组,每行包含两个值。第一个值是activerecord对象,第二个值是计算字段。