防止执行lambda条件

时间:2014-10-25 01:43:47

标签: ruby-on-rails ruby-on-rails-4 spree

Spree框架中的Order模型"有很多"订单项,如下所示:

has_many :line_items, -> { order('created_at ASC') }, dependent: :destroy, inverse_of: :order

我添加了一个名为SelfFulfillmentUnit的模型,其中"属于"订单项(订单项可以有多个SelfFulfillmentUnit个对象),简单描述如下:

has_many :self_fulfillment_units

我希望能够通过订单项访问与此订单相关联的所有自我履行单元,因此我有一个订单装饰器,它创建了这样描述的关系:

has_many :self_fulfillment_units, through: :line_items

问题:

不幸的是,当我这样做时:

order.self_fulfillment_units

我收到此错误:

  

模糊列名:created_at:SELECT   spree_self_fulfillment_units.id FROM" spree_self_fulfillment_units"   INNER JOIN" spree_line_items"上   " spree_self_fulfillment_units"" LINE_ITEM_ID" =   " spree_line_items"" ID"在哪里" spree_line_items"。" order_id" = 13   ORDER BY created_at ASC

我很确定这是由has_many :line_items模型的Order中的lambda条件引起的。

假设是这种情况,我不确定如何防止条件块执行。根据{{​​3}},我尝试将unscoped方法添加到订单选择调用(Spree::Order.unscoped.by_number....),但这似乎没有任何影响(ORDER BY created_at ASC部分仍然存在)

我能找到的唯一解决方案是将其添加到订单装饰器

has_many :line_items, dependent: :destroy, inverse_of: :order

有效地覆盖基本订单模型中的line_items关系线。然而,这显然不是一个理想的解决方案,因为现在每次调用line_items关系都会受到影响。

或者,我可以使用不同的名称创建自定义订单项has_many关系,但不包含条件块。

问题:除了那个解决方案之外,我现在还可以确定如何解决这个问题。有没有办法以某种方式抑制关系语句的条件块?

1 个答案:

答案 0 :(得分:1)

我充分考虑了两个选项:覆盖has_many关系但修复错误,不要更改它的功能。此外,您可以向狂欢发送拉取请求。

您可以在config文件夹中添加初始化程序:

module Spree
  class Order < Spree::Base
    has_many :line_items, -> { order(:created_at) }, dependent: :destroy, 
      inverse_of: :order
  end
end 

然后在控制台上可以看到:

~/rails/try/spree_pj (development) > Spree::Order.first.line_items
  Spree::Order Load (0.2ms)  SELECT  "spree_orders".* FROM "spree_orders"
  ORDER BY "spree_orders"."id" ASC LIMIT 1
  Spree::LineItem Load (0.2ms)  SELECT "spree_line_items".* FROM 
  "spree_line_items" WHERE "spree_line_items"."order_id" = ?  ORDER BY 
  "spree_line_items"."created_at" ASC [["order_id", 1]]
=> #<ActiveRecord::Associations::CollectionProxy [....]>

ORDER BY "spree_line_items"."created_at" ASC您的问题已修复。

行动!我看到这个在控制台工作正常,但不在服务器上!我把这个答案保留了下来,因为它可以帮助另一个想法。