关联两个属于第三个独立表的表

时间:2014-06-05 22:54:35

标签: ruby-on-rails postgresql activerecord database-design ruby-on-rails-4

我有三张桌子:

Topics        Jobs          Requests
-----         ----          --------
title         description   request
description   worker_id     user_id   
              topic_id      worker_id
                            topic_id

工作人员为每个主题创建一份工作。然后,用户可以请求工作人员完成该工作。

我目前的协会:

class Topic < AR::Base
  has_many :jobs
  has_many :worker, through: :jobs
end

class Job < AR::Base
  belongs_to :topic
  belongs_to :worker
  has_many :requests
end

class Request < AR::Base
  belongs_to :user
  belongs_to :worker
  belongs_to :topic
  has_one: :job, through: :topic   #This doesn't work, lol.
end

问题:

我不确定请求是属于主题还是作业。

我需要:

  • 比作业信息更频繁地访问请求的主题信息,但仍然可以获得作业信息。

  • 根据主题和工作人员创建请求,而不是作业。 (这很重要。)

  • 列出给定主题的所有请求。

  • 预加载请求的主题和作业信息。 (也很重要。)

我对直接关联请求和作业犹豫不决,因为作业包含一些不应该对所有请求都可用的信息。通过该关联,任何请求都可以访问该信息,但这可能并不是一件大事。

另外,因为我需要请求和主题之间的这种紧密关联,所以使用该关联似乎更合乎逻辑,但随后我失去了轻松的Job访问权限。 (通过上述关联,我必须使用自定义方法:Job.find_by(topic_id: self.topic_id, worker_id: self.worker_id),它不允许预加载或多个请求。)

最好的方式是什么?

(如果有更好的标题,请告诉我。)

1 个答案:

答案 0 :(得分:0)

由于主题始终属于Job,因此Request应属于Job且仅属于Job。您始终可以将关联遍历到主题。这在逻辑上是有道理的,因为用户要求工人完成工作。该主题仅是有关该工作的其他信息。如果用户请求了某个主题,您如何知道他们想要做什么工作?

另外需要注意的是,因为工作人员已经附加到工作中(没有工人会做他们没有创建的工作),所以worker_id应该只在Job模型上,而不是Request模型。

将你的桌子换成这样,你应该很好:

Topics        Jobs          Requests
-----         ----          --------
title         description   request
description   worker_id     user_id   
              topic_id      job_id