【问题标题】:How to search Spree::Orders and associations with ransack gem如何使用 ransack gem 搜索 Spree::Orders 和关联
【发布时间】:2015-10-13 12:10:07
【问题描述】:

使用 Spree 和 ransack,如何返回 Spree::Orders 中包含的自某个日期以来已完成的 Spree::Variants? ransack 文档提供了一些关于搜索关联的建议,但似乎不够深入。

Spree::Order
  has_many :line_items

Spree::LineItem
  belongs_to :line_item
  belongs_to :variant 

Spree::Variant
  has_many: line_items

已完成的订单可以通过以下方式搜索:

  o=Spree::Order.complete.ransack(completed_at_gt: '2015-05-01')

但如何在这些订单中找到 Spree::LineItems 并返回这些订单中的 Spree::Variants 的 SKU 尚不清楚。

我正在尝试使用 ransack,因为它将在 Spree 报告中使用。

【问题讨论】:

    标签: ruby-on-rails-3 spree ransack


    【解决方案1】:

    你根本不需要在这个区域使用 ransack。 ActiveRecord 会让你做你需要的:

    Spree::Order.complete.where(
      Spree::Order.arel_table[:completed_at].gteq(
        Date.new(2015, 10, 1)
      )
    ).joins(
      line_items: :variant
    ).select(:sku).distinct.pluck(:sku)
    

    如果你必须使用ransack,你可以获取ActiveRecord关系,使用.result并应用连接等。

    Spree::Order.complete.ransack(
      completed_at_gt: '2015-05-01'
    ).result.joins(
      line_items: :variant
    ).select(:sku).distinct.pluck(:sku)
    

    由于您没有.pluck,因此您正在运行一个非常旧版本的 Spree,它是 Rails 4 之前的版本。您可以使用以下方法获得结果:

    Spree::Order.complete.ransack(
      completed_at_gt: '2015-05-01'
    ).result.joins(
      line_items: :variant
    ).select(:sku).map(&:sku).uniq
    

    【讨论】:

    • 该问题指定了 ransack 是必需的,因为似乎 ransack 是事实上的狂欢报告。我已经更新了问题以反映这一点。此外:- undefined method 'pluck' for #<Arel::Nodes::Distinct:0x8fcdc00>
    • 我根据您的反馈添加了其他答案。初始查询适用于 Spree 2.1+,但 .pluck 在 Rails 3 中不存在,因此您需要以列出的替代方式获取值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多