賞金將在 5 天后到期。此問題的答案有資格獲得 300聲望賞金。 Dave正在從有信譽的來源尋找答案。
我正在使用 Rails 6.1.4.4。我有這個帶有 has_many 的模型
class MyObject < ApplicationRecord
has_many :products, inverse_of: :application, as: :item
如何撰寫一個執行左外連接并在 LEFT-OUTER-JOIN-ON 子句中添加條件的范圍?我已經退回到原始 sql ......
scope :awaiting_funding, ->(resubmissions: false) {
joins("LEFT OUTER JOIN products on products.item_id = my_objects.id and products.product_type = 11 and products.item_type = ‘MyObject’”).where('products.id is null')
}
但我想將其轉換為更像 Rails 的查找器方法。
uj5u.com熱心網友回復:
這行得通嗎?
scope :awaiting_funding, ->(resubmissions: false) {
left_outer_joins(:products).where(product_type: 11, item_type: 'MyObject', products: { id: nil })
}
uj5u.com熱心網友回復:
我會給你一個非常通用的左外連接示例
Source.
select('a.*', 'count(b.*)').
left_outer_joins(:b).
joins(:c).
where('c.body_parser = ?', true).
group('a.id').
having('count(b.id) = 0').
all
否則,您也可以使用includes. 這將生成一個LEFT OUTER JOIN查詢
MyObject.includes(:products).where(product_type: 11, item_type: 'MyObject', products: { id: nil })
uj5u.com熱心網友回復:
定義一個新的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'
現在您可以定義您的范圍
scope :awaiting_funding, ->(resubmissions: false) {
where.missing(:my_object_products)
}
這將創建查詢 whereproduct_type并且item_type是 LEFT OUTER JOIN 中 ON 的一部分
PS:使用更好的名稱,my_object_products但你明白了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/441501.html
標籤:轨道上的红宝石 范围 左连接 ruby-on-rails-6 发现者
下一篇:在最近的設計版本中,引數“case_insensitive_keys”是否會在驗證期間降低鍵的大小,如果不是,哪個版本解決了這個問題?
