1
class User
 include Mongoid::Document
 has_many :orders
 has_one :payments
end

class Order
 include Mongoid::Document
 belongs_to :user
 has_one :payment, dependent: :destroy, :autosave => true
end

class Payment
 include Mongoid::Document
 belongs_to :order
 belongs_to :user
ebd

user_controller.rbjobsアクションについて:

def jobs
 #
 #
 jobs = Order.where(:seller_id => current_user.id).order_by :created_at, :desc
 @jobs = []
 for j in jobs
  if j.payment.preapproval_key != nil && j.payment.correlation_id != nil && j.payment.approved == true
   @jobs << j
  end
 end
 #
 #
end

payment.preapproval_key != nil && payment.correlation_id != nil && payment.approved == trueこのループを使用せずにすべてのジョブをフィルタリングすることは可能ですか?

これを行うためのより良い方法はありますか?

4

1 に答える 1

2

次の行で何かを行うことができますが、まだいくつかの db リクエストがありますが、これは結合が利用できないために予想されることです。しかし、それはあなたが今やっている db リクエストよりも少ないでしょう:

all_order_ids = Order.where(:seller_id => current_user.id).only(:_id).map(&:id)
payments = Payment.where(:order_id.in => all_order_ids, 
                         :preapproval_key.ne => nil,
                         :correlation_id.ne => nil,
                         :approved => true)
jobs = Order.where(:_id.in => payments.only(:order_id).map(&:order_id))
于 2013-01-22T04:34:32.940 に答える