【问题标题】:Spree, Rails LineItems get only those that belongs_to completed OrderSpree,Rails LineItems 只获取那些属于_to完成的订单
【发布时间】:2015-10-12 07:30:10
【问题描述】:

我正在尝试搜索订单已完成的所有 LineItems。

# /spree/order.rb

def self.complete
  where.not(completed_at: nil)
end

我试过了:

product.orders.complete.map { |o| o.line_items }.flatten

但它返回一个数组,我不能这样做.where(variant_id: ID)

或:

product.orders.includes(:line_items).complete.where(line_items: { variant_id: 263})

但它说:PG::UndefinedTable: ERROR: missing FROM-clause entry for table "line_items"

然后我尝试了:

product.line_items.includes(:order).where(variant_id: ID).where.not(order: { completed_at: nil })

它返回ActiveRecord::ConfigurationError: Association named 'orders' was not found on Spree::LineItem; perhaps you misspelled it?

这种方式也可以:product.orders.complete ... 但不知道如何通过其 variant_id 搜索 LineItems。

我该如何解决?如何退回属于已完成订单的所有产品 LineItems?
非常感谢!

【问题讨论】:

    标签: sql ruby-on-rails postgresql spree


    【解决方案1】:

    啊。好的,想通了。

    终于用这个解决了,注意我把表名从orders改成了spree_orders

    product.line_items.joins(:order).where.not(spree_orders: { completed_at: nil })
    

    而且,可以使用.includes(:order) 完成,但它似乎需要更长的查询时间并且比.joins(:order) 花费的时间要长一些。

    【讨论】:

      【解决方案2】:

      你可以很容易地做到这一点:

        # in Order Model (order.rb)
        scope :completed, -> { where.not(completed_at: nil) }
      
        # in Product Model (product.rb)
        has_many :orders
        delegate :completed, to: :orders, prefix: true
      

      现在,您可以通过product 拨打orders_completed

      product.orders_completed
      

      然后你可以用这个链接到任何地方:

      product.orders_completed.where(...)
      

      【讨论】:

      • 谢谢大佬,一会儿试试,可能比我的解决方案快。
      猜你喜欢
      • 2011-01-22
      • 2022-10-23
      • 1970-01-01
      • 2017-09-05
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多