Ruby on Rails ActiveRecord任务属于公司& has_many用户

时间:2014-04-03 18:17:09

标签: ruby-on-rails ruby activerecord

我是Ruby on Rails的新手,不知道这是一个好的设置,还是有更好的配置。

背景: 系统将用于为用户分配任务,跟踪分配者,并允许为多人分配任务。

创建公司模型,用户模型,任务模型和user_tasks模型。
公司类
has_many:用户
has_many:任务

用户类
belongs_to:公司
has_many:user_tasks
has_many:tasks,通过:: user_tasks

任务类
belongs_to:公司
has_many:user_tasks
has_many:users,通过:: user_tasks

UserTasks类
belongs_to:用户
belongs_to:任务
*使用布尔值跟踪赋值器

3 个答案:

答案 0 :(得分:2)

我认为这很完美。与has_many (model1), through: (model2)关联相比,有一个has_and_belongs_to_many关联有一个很大的优势,因为您可以通过ActiveRecord查询接口访问连接模型(UserTasks您的情况){{1} }或UserTask.where()等等。直接查询联接表有时可以缩短查询时间。如果使用UserTask.find_by(user_id: 1)关联,您将拥有一个无法在Rails中直接访问的数据库表,而无需使用SQL。

答案 1 :(得分:0)

如果它只是一个habtm表,你可能不需要UserTasks类。因此,只需为该表创建一个迁移,但跳过添加模型。然后在User中,has_and_belongs_to_many :tasksTask执行has_and_belongs_to_many :users

我看到的另一件事是公司既为任务又为用户设定。您可能有必须遵守业务规则,但如果没有,您可能只能说Company -> has_many :tasks, through: :users

答案 2 :(得分:0)

我赞成:has_many, :through超过has_many_and_belongs_to_many或HABTM。例如,我可以被分配给一个任务两次,一个作为程序员,另一个作为设计者。所以我需要在UserTask列上使用某种“JobDescription”列,我需要两行UserTask表来表示我是一个任务的程序员,另一行代表我是一个任务的设计者。

您希望编写更易于更改的软件,即使HABTM较短,您可能会在将来更改软件,例如在同一任务中执行两个子任务的人员。请记住,数据库中的行是一段数据,或“一件事”,如果这是有道理的。至少,你得到时间戳。