0

RoR 新手,但正在尝试构建应用程序 - 我正在寻找有关我的数据库结构的一些建议。

我有 4 个模型/表:用户 > 客户 > 工作 > 任务

该应用程序将按如下方式工作:

  1. 用户将登录
  2. 他们可以添加客户
  3. 他们可以向客户添加工作
  4. 他们可以将任务添加到工作中

所以,Tasks 属于 Jobs,Jobs 属于 Clients,Clients 属于 Users。

我想查询数据库中的任何一个客户端、作业或任务,并确保它属于当前登录的用户。我正在努力编写一个“railsy”连接查询并设计我的关联,这样我就可以做到这一点。

我知道如果我在每个表中都有一个 user_id 字段,这将非常容易,但这似乎不是正确的方法。

我已经阅读了http://guides.rubyonrails.org/association_basics.html上的指南,但我仍然有点摸不着头脑。谁能阐明我如何构建我的数据库——更重要的是我的关联?

谢谢。

4

2 回答 2

2

似乎您从一侧设置了关联,您所要做的就是使用 has_many 添加关联的另一端:

class Task < ActiveRecord::Base
  belongs_to :job
end

class Job < ActiveRecord::Base
  belongs_to :client
  has_many :tasks
end

class Client < ActiveRecord::Base
  belongs_to :user
  has_many :jobs
  has_many :tasks, :through => :jobs
end

class User < ActiveRecord::Base
  has_many :clients
  has_many :jobs, :through => :clients
  has_many :tasks, :through => :jobs
end

现在 ActiveRecord 将为您处理连接。确实,在纯 db 模式中,您不应将 user_id 放在多个位置(此处为 clients 表)。但是有时它也会被添加到任务和作业表中以提高性能,因为这样数据库查询就不会那么大了。尽管如此,您必须付出更多努力来使数据保持一致 - 例如,您必须确保作业具有与其客户端相同的 user_id。

然后,您将能够定义快捷方式关联,例如:

class Task < ActiveRecord::Base
  belongs_to :user
end

但在这种情况下,除非您注意到查询对您的需求来说太慢,否则我不会这样做。过早的优化是邪恶的:-)

于 2012-05-26T07:14:07.010 回答
1

我不确定,如果我正确理解了你的问题,但我相信这可能是一个解决方案:

如果您像这样编写关联,ActiveRecord如果您要求user.jobs或,将自动创建连接user.tasks

class User < ActiveRecord::Base
  has_many :clients
  has_many :jobs, :through => :clients
  has_many :tasks, :through => :jobs
end

有关更多信息,请参阅Rails-Api-Documentation

如果您想在一个请求中为用户获取所有内容。你可以这样做:

user.clients.joins(:jobs => :tasks)
于 2012-05-26T07:17:03.513 回答