2013-04-24 66 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