2013-04-24 67 views
1

這樣做的最好方法是什麼?我正在嘗試這樣的事情,但感覺...錯了。 (注:這是所有關於:條件中的has_many關聯...)Rails關聯:如何限制/範圍has_many:通過多個自引用條件?

class Submission < ActiveRecord::Base 
    belongs_to :checklist 
    has_many :jobs, :through => :checklist, :source => :job, :conditions => ["jobs.archived = false OR jobs.archived_at > #{self.created_at} OR jobs.created_at < #{self.created_at}"] 
end 

Rails的3.2.11和Ruby 1.9.3

我試圖做

我需要在has_many上通過多個條件:通過關聯指的是在這些條件下進行比較的「自我」模型。

我找到了多個條件的示例。我找到了自引用比較的例子。但我無法找到這兩個元素。這讓我覺得我做錯了。

背景和定義

提交記錄了清單的快照,並在某個時間點及其相關作業。所以,我希望能夠說「submission.jobs」,並看到在提交本身創建時與提交清單相關的工作。*

*它實際上稍微複雜一點:我想要工作這在創建提交時存在並且當時尚未存檔。

檢查清單是動態的,可以隨時間變化,但我始終通過本地歸檔系統保留歷史記錄,因此,在爲清單創建提交時,檢查清單上的工作將成爲檢查清單的工作,其中工作.created_at在Submission.created_at之前(並且尚未歸檔)。

因此,雖然提交文件屬於清單,而清單has_many作業,但對於特定提交而言唯一重要的作業是創建提交時存在(並且尚未歸檔)的作業。

回答

1

您可以在Job使用範圍和可能的方法加入到Submission

class Job < ActiveRecord::Base 
    scope :unfinished_since, lambda { |timestamp| 
    where("archived = ? OR archived_at > ? OR created_at < ?", false, timestamp, timestamp)   
    } 
end 

class Submission < ActiveRecord::Base 
    belongs_to :checklist 
    has_many :jobs, :through => :checklist, :source => :job 

    def unfinished_jobs 
    jobs.unfinished_since(self.created_at) 
    end 
end 
+0

出色答卷。 FWIW,我不得不稍微調整一下標準,所以它看起來像這樣:'where(「created_at <?AND(archived =?OR archived_at>?)」,timestamp,false,timestamp)'。我提供的標準基本上是在提交之前創建的任何工作_;實際上,我的意思是使用標準來拉取在提交之前創建的任何作業,但在創建提交之前不會將其歸檔。但是根據我最初提供的標準,你的回答是正確的。謝謝! – JoshDoody 2013-04-27 17:05:12