在 Rails 6 中,如何向左外连接查找器添加条件?

Dav*_*ave 3 finder scope ruby-on-rails left-join ruby-on-rails-6

I\xe2\x80\x99m 使用 Rails 6.1.4.4。我这个模型有一个 has_many

\n
class MyObject < ApplicationRecord\n\n    has_many :products, inverse_of: :application, as: :item\n
Run Code Online (Sandbox Code Playgroud)\n

如何编写执行左外连接并在 LEFT-OUTER-JOIN-ON 子句中添加条件的作用域?我已经求助于原始sql \xe2\x80\xa6

\n
scope :awaiting_funding, ->(resubmissions: false) {\n\n  joins("LEFT OUTER JOIN products on products.item_id = my_objects.id and products.product_type = 11 and products.item_type = \xe2\x80\x98MyObject\xe2\x80\x99\xe2\x80\x9d).where('products.id is null')\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我想将其转换为更像 Rails 的查找器方法。

\n

Chr*_*ris 5

定义一个新的has_many

class MyObject < ApplicationRecord

    has_many :products, inverse_of: :application, as: :item
    has_many :my_object_products, -> { where(product_type: 11, item_type: 'MyObject') }, class_name: 'Product'
Run Code Online (Sandbox Code Playgroud)

现在您可以定义您的范围

scope :awaiting_funding, ->(resubmissions: false) {
   where.missing(:my_object_products)
}
Run Code Online (Sandbox Code Playgroud)

这将创建查询 whereproduct_typeitem_typeare part of the ON in LEFT OUTER JOIN

PS:使用更好的名称,my_object_products但你明白了。