我有三张桌子:
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)
,它不允许预加载或多个请求。)
最好的方式是什么?
(如果有更好的标题,请告诉我。)
答案 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