[英]How would I sort all the values of an array of hashes in Rails? Mongo
我有一个控制器操作可以为我获取一些信息:
@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
我们有一个帐户,然后我们抓住了属于这个帐户的所有客户,然后我们抓住了每个客户的所有工作,并将它们推到一个数组中。
所以我想做的就是通过:start_date值对最终数组@jobAc进行排序。
当然,我首先将棘手的查询推入该数组,如您在日志中看到的那样:
控制台日志:
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.
有任何想法吗?
这里的问题是,您一次循环只选择一部分数据集,而不是对整个数据集进行排序。
您可以通过执行单个查询以查找所有作业以及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]) )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.