1

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

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

导轨 3.2.11,红宝石 1.9.3

我正在尝试做的事情

我需要在 has_many :through 关联上传递多个条件,参考“自我”模型在这些条件下进行比较。

我找到了具有多种条件的示例。我找到了自我引用比较的例子。但是我找不到这两个元素的任何东西。这让我觉得我做错了。

背景和定义

提交记录了检查表及其相关作业在某个时间点的快照。因此,我希望能够说“submission.jobs”并查看在创建提交本身时与提交清单相关联的工作。*

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

清单是动态的并且会随着时间而改变,但我总是通过一个本土的归档系统保持历史记录的完整性,因此当为该清单创建提交时,清单上的作业将是 Job.created_at 之前的清单的作业Submission.created_at(尚未归档)。

因此,尽管一个提交属于_一个清单,并且清单有_许多作业,但对于特定提交来说唯一重要的作业是在创建提交时存在(并且尚未归档)的作业。

4

1 回答 1

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
于 2013-04-24T23:49:05.363 回答