我希望能够使用新的计算字段对我的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”。
答案 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对象,第二个值是计算字段。