如何在Rails中对哈希数组中的所有值进行排序?蒙戈

时间:2014-02-10 05:28:58

标签: arrays ruby-on-rails-3 mongodb hash

我有一个控制器动作,可以为我抓取一些信息:

@account = Account.find(params[:id])
@acct_cust = Customer.all(:account_id => @account.id.to_s)
@acct_cust.each do |ac|
  @jobAc << Job.where(:customer_id => ac.id).sort(:start_date)
end

我们拥有该帐户,然后我们抓住所有属于该帐户的客户,然后我们抓住每个客户的所有工作并将它们推入一个阵列。

所以我想做的是将最终数组 - @jobAc - 按:start_date值排序。

当然,正如您在日志中看到的那样,我开始将这些数据推入到这个数组中:

控制台日志:

 jobAc is [#<MongoMapper::Plugins::Querying::DecoratedPluckyQuery customer_id:  
 BSON::ObjectId('52705ff24031a0000e000179'), sort: [["start_date", 1]], transformer:  
 #<Proc:0x007fe3e6f834d8@/usr/local/rvm/gems/ruby-2.0.0-p247/gems/mongo_mapper-0.13.0.beta2
 /lib/mongo_mapper/plugins/querying.rb:66 (lambda)>>, 
 #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery customer_id: 
 BSON::ObjectId('5279795e2f6984000b00014f'), sort: [["start_date", 1]], transformer: 
 #<Proc:0x007fe3eb13b8f8@/usr/local/rvm/gems/ruby-2.0.0-p247/gems/mongo_mapper-0.13.0.beta2
 /lib/mongo_mapper/plugins/querying.rb:66 (lambda)>>, 
 #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery customer_id: 
 BSON::ObjectId('52797beb2f698400ef0000c4'), sort: [["start_date", 1]], transformer: 
 #<Proc:0x007fe3e9da35e8@/usr/local/rvm/gems/ruby-2.0.0-p247/gems/mongo_mapper-0.13.0.beta2
 /lib/mongo_mapper/plugins/querying.rb:66 (lambda)>>, 
 #<MongoMapper::Plugins::Querying::DecoratedPluckyQuery customer_id: 
 BSON::ObjectId('527dac2d3d126f0107000059'), sort: [["start_date", 1]], transformer: 
 #<Proc:0x007fe3eb170cb0@/usr/local/rvm/gems/ruby-2.0.0-p247/gems/mongo_mapper-0.13.0.beta2
 /lib/mongo_mapper/plugins/querying.rb:66 (lambda)>>]

如果我使用@jobAc = Job.all(query),我最终会得到一个像这样的数组:

[[{1},{2},{3}],[{1},{2}]]

我甚至无法理解我正在试图正确提问的问题:)我是否试图压扁一系列哈希?我试过了,但没想出我的想法。

我试过了:

@jobAc.sort_by!(&:start_date).reverse but this of course cannot be done while they are plucky queries instead of the actual values.

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这里的问题是,您在循环中一次只选择数据集的一部分,而不是整理整个数据集。

您可以通过执行单个查询来查找所有作业,并使用sort参数来改进此代码的运行时并应用排序:

@account = Account.find(params[:id])
@acct_cust = Customer.all(:account_id => @account.id.to_s)
@jobAc = Job.where(:customer_id.in => @acct_cust.map(:id)).sort(:start_date)

由于您使用的是MongoMapper,我建议您使用关联和范围:

class Account
  many :customers
end

class Customer
  belongs_to :account
end

class Job
  scope :for_account, ->(account) do
    where(:customer_id.in => account.customers.fields(:id).all.map(:id))
  end
end

然后,您可以找到给定客户的所有工作:

@jobAc = Job.for_account( Account.find(params[:id]) )