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
关系,但不包含条件块。
问题:除了那个解决方案之外,我现在还可以确定如何解决这个问题。有没有办法以某种方式抑制关系语句的条件块?
答案 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
您的问题已修复。
行动!我看到这个在控制台工作正常,但不在服务器上!我把这个答案保留了下来,因为它可以帮助另一个想法。