Rails associations: How do I limit/scope a has_man

2019-09-01 02:21发布

什么是做到这一点的最好方法是什么? 我想这样的事情,但感觉...错了。 (注:这是所有关于:条件中的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”,并看到了与提交的清单在提交自己创建的时间相关的作业。*

*它实际上是稍微复杂些:我想创建提交和尚不是当时归档时存在的乔布斯。

该清单是动态的,可以随时间而改变,但我始终保持历史记录的完整通过本土的归档系统,所以乔布斯时,提交了该清单创建将是清单的乔布斯那里Job.created_at是前清单Submission.created_at(且尚未存档)。

所以,虽然提交bel​​ongs_to的一个清单,以及清单的has_many乔布斯,曾经不管特定提交的唯一工作是在提交创建的时间存在(和尚未归档)的职位。

Answer 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


文章来源: Rails associations: How do I limit/scope a has_many :through with multiple self-referencing conditions?