Rails关联:如何限制/范围has_many:通过多个自引用条件?

最好的方法是什么? 我正在尝试这样的事情,但感觉……错了。 (注意:所有关于:has_many关联中的条件……)

class Submission  :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”并查看在提交本身创建时与提交的核对表关联的作业。*

*它实际上稍微复杂一点:我想要在创建提交时存在的作业以及当时尚未存档的作业。

清单是动态的,可以随时间变化,但我总是通过自行建立的归档系统保持历史记录的完整性,因此当为该清单创建提交时,清单上的作业将是Checklist的Job,其中Job.created_at之前是Submission.created_at(尚未存档)。

因此,虽然提交属于清单,而清单属于清单,但是对于特定提交而言,唯一重要的工作是在创建提交时存在(并且尚未存档)的作业。

您可以在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