2011-10-10 42 views
1

是否有可能在rails 3.1中的has_many :: through關係上設置實例級約束?has_many:通過實例特定條件

http://guides.rubyonrails.org/association_basics.html#the-has_many-association

喜歡的東西:

Class A 
    has_many :c, :through => :b, :conditions => { "'c'.something_id" => @a.something_id } 

的文檔給了我希望這一點,但它不爲我工作:如果您需要在動態評估條件

運行時,你可以使用 單引號中的字符串插值:

class Customer < ActiveRecord::Base 
    has_many :latest_orders, :class_name => "Order", 
    :conditions => 'orders.created_at > #{10.hours.ago.to_s(:db).inspect}' 
end 

這給了我在軌道3.1上的「無法識別的標記」#'「。想知道如果這個功能不再工作?

編輯

要說明爲什麼我不認爲是範圍的解決方案。我希望能夠從所有具有條件的C的實例(它基於A實例的屬性)中獲得。這些是唯一一個應該與A相關聯的Cs。爲了使用範圍來做到這一點,我將把範圍放在C上,它需要一個參數,然後必須從@a調用它來獲得一些值。我不明白爲什麼這比直接將它合併到我的has_many查詢中更好。

回答

2

使用範圍上orders型號:

class Order < ActiveRecord::Base 
    belongs_to :customer 
    scope :latest, lambda { where('created_at > ?', 10.hours.ago) } 
end 

然後用叫它:

@customer.orders.latest 

如果你真的想使用latest_orders,可以改爲將其添加到客戶模型:

def latest_orders 
    orders.where('created_at > ?', 10.hours.ago) 
end 
+0

是的。切勿將關係子句與條件混合使用,即使是排序也是如此。它會讓你思考錯誤的方式,這對軌道是致命的! –

+0

我如何複製我想在示例中使用範圍的has_many?我在我的情況下使用了一個proc來工作,所以我不確定爲什麼這樣更好。我應該提一下,在我的情況下,A的條件成立時,確實只有'C'。其他結果沒有關聯,返回它們也沒有意義 – spike

+0

您應該按照我描述的方式使用範圍。關係在模型之間,「latest_order」不是模型,而是模型的範圍。即使你有它的工作,Rails的標籤行是「約定優於配置」,並在這裏約定使用範圍。 – bricker