2013-12-18 71 views
1

我有這種關聯在Rails 3.2的應用程序的Project型號:覆蓋ActiveRecord的關聯條件

has_many :pledges, conditions: { paid: true } 

在一個地方,我需要所有未付認捐。除了兩個明顯的解決方案(定義與paid: false條件的另一個關聯或找到承諾Pledge.where...)之外,是否有可能立即放棄條件?類似

東西:

project.pledges.unscoped.where(paid: false) # does not work since the link to project is also lost 
project.pledges.where(paid: false)   # no good since it does "paid=t AND paid=f" 

回答

0

爲什麼不加範圍的承諾的模式?

class Pledge < ActiveRecord::Base 
    scope :paid, -> { 
    where(paid: true) 
    } 
    scope :unpaid, -> { 
    where(paid: false) 
    } 
end 

然後,你可以這樣做:

project.pledges.paid 
project.pledges.unpaid 

您還需要從項目模型關聯中刪除的條件。

[編輯]另一種解決方案:

添加在產品的第二關聯未付承諾:

class Product 
    has_many :unpaid_pledges, class_name: Pledge, conditions: { paid: false } 
end 

然後,你可以做

project.pledges #these are all paid 
project.unpaid_pledges #all unpaid pledges belonging to product 
+0

不太什麼我要找的。模型中的條件是確保始終支付承諾。有一種安全措施可以在那裏執行。 – svoop

+0

增加了一個替代方案,不知道如何做到這一點,而不訴諸'Pledge.where(...)'。刪除協會的範圍,而不刪除協會本身是不可能的在軌道 – Slicedpan

+1

Woops,你建議在你的問題的替代!無論如何,[這裏](http://stackoverflow.com/questions/3963124/default-scope-and-associations)一個類似的問題,還有另一種方式,'Pledge.unscoped {product.pledges}'我認爲是等效的 – Slicedpan