2017-06-20 50 views
0

我有以下的範圍內我的模型裏面:重寫範圍使用ActiveRecord傭工

scope :by_attributes, ->(names) { 
    attribute_ids = ReferralPartnerAttribute.where(name: names).pluck(:id) 
    if attribute_ids.any? 
     where(
     "ARRAY[?] <@ (
      SELECT array_agg(referral_partner_attribute_id) 
      FROM referral_partner_referral_partner_attributes 
      WHERE referral_partner_referral_partner_attributes.referral_partner_id = referral_partners.id)", attribute_ids 
    ) 
    else 
     none 
    end 
    } 

我怎樣才能重寫了它更多的ActiveRecor方式?這可能嗎?

+0

可以共享表之間存在什麼樣的關聯在這裏使用?另外,我不確定這是否符合您的想法。這聽起來像你想要referral_partners具有匹配名稱的referral_partner_attributes。但是我相信如果你傳遞任何存在的屬性,這將返回* all * referral_partners。 –

回答

1

如何調用範圍內的另一個範圍?

scope :by_attributes, ->(names) { (attribute_ids = ReferralPartnerAttribute.where(name: names).pluck(:id)).present? ? another_scope(attribute_ids) : none } 
scope :another_scope, ->(attribute_ids) { where("ARRAY[?] <@ (
     SELECT array_agg(referral_partner_attribute_id) 
     FROM referral_partner_referral_partner_attributes 
     WHERE referral_partner_referral_partner_attributes.referral_partner_id = referral_partners.id)", attribute_ids 
    )} 

這樣做也將有助於直接調用這個範圍,如果你已經在手attribute_ids,並不需要檢查它是否是空的或不..

+0

有沒有辦法用一些ActiveRecord助手來重寫這個原始的sql? –

+1

對'jsonb'不太瞭解,但是我仍然懷疑它可以被簡化,因爲它是一個聚合查詢,它不被'AR'很好的支持,但是,不確定是否可以替換'FROM referral_partner_referral_partner_attributes WHERE referral_partner_referral_partner_attributes.referral_partner_id = referral_partners .id'與'連接()' –