我有一个控制器动作,可以为我抓取一些信息:
@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.
有什么想法吗?
答案 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]) )