Rails关联:如何限制/范围has_many:通过多个自引用条件?
问题描述:
这样做的最好方法是什么?我正在尝试这样的事情,但感觉...错了。 (注:这是所有关于:条件中的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作业,但对于特定提交而言唯一重要的作业是创建提交时存在(并且尚未归档)的作业。
答
您可以在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
出色答卷。 FWIW,我不得不稍微调整一下标准,所以它看起来像这样:'where(“created_at ?)”,timestamp,false,timestamp)'。我提供的标准基本上是在提交之前创建的任何工作_;实际上,我的意思是使用标准来拉取在提交之前创建的任何作业,但在创建提交之前不会将其归档。但是根据我最初提供的标准,你的回答是正确的。谢谢! – JoshDoody 2013-04-27 17:05:12