【问题标题】:Ruby on Rails ActiveRecord task belongs to company & has_many usersRuby on Rails ActiveRecord 任务属于公司和 has_many 用户
【发布时间】:2014-05-15 18:15:48
【问题描述】:

我是 Ruby on Rails 的新手,想知道这是否是一个好的设置,或者是否有更好的配置。

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

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

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

任务类
所属:公司
has_many :user_tasks
has_many :users, through: :user_tasks

UserTasks 类
属于_to :user
属于_to:任务
*使用布尔值跟踪分配器

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

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

    【讨论】:

    • 嘿 Raoul,当你说“你有数据库表,如果不使用 SQL 就无法在 Rails 中访问”,你是什么意思/你能举个例子吗?这些是在您在现有数据库上构建 Rails 应用程序时使用的吗?
    • 嗨 Daryll,我的意思是,通过 has_and_belongs_to_many 关系,您显然可以从 Task 表中查询 User 表,例如使用 User.tasks,但要访问联接表,您需要像这样运行 SQL 查询:User.find_by_sql("SELECT * FROM users INNER JOIN user_tasks ON users.id = user_tasks.user_id")。关于现有数据库,我认为应该可以将has_many: .. through: .. 关联放在现有数据库之上,只要连接表存在并且 Rails 和 SQL 中的连接模型的名称匹配。
    【解决方案2】:

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

    我看到的另一件事是,公司是为任务和用户设置的。您可能有业务规则来说明为什么必须这样做,但如果没有,您可能只能说 Company -> has_many :tasks, through: :users

    【讨论】:

    • 您说得有道理,但是如果他们需要在特定的“UserTask”上添加一个新列怎么办。例如,我可以被分配两次任务,一次是程序员,另一次是设计师。所以我需要 UserTask 列上的某种“JobDescription”列,并且我需要两行 UserTask 表来表示我是一个任务的程序员,另一行表示我是一个任务的设计师。跨度>
    • 达里尔-正确。如果它只是一个 habtm 表,则不需要该类,但如果存储任何其他数据,则需要中间类。
    • 嗨 Brandon - 我使用 HABTM 的唯一问题是我需要跟踪最初将任务分配给其他人的人。另外,我同意 Daryll 的观点,我可能需要更新 UserTask 表以包含其他条件。我将 company_id 存储在我们需要从关系表中删除(触发)user_id 的事件中......我们仍然希望任务存在,允许我们重新分配给另一个用户。
    • 不用担心。我想我在has_many, :through 博客上花了太多时间。 Start here,2014 Rails 看起来与 2006 Rails 相似,真是太酷了。
    • 布兰登 - 我很欣赏这个建议。快乐编码!
    【解决方案3】:

    比起has_many_and_belongs_to_many 或HABTM,我更喜欢:has_many, :through。例如,我可以被分配两次任务,一次是程序员,另一次是设计师。所以我需要 UserTask 列上的某种“JobDescription”列,并且我需要两行 UserTask 表来表示我是一个任务的程序员,另一行表示我是一个任务的设计师。

    您想编写更容易更改的软件,即使 HABTM 更短,您将来也可能会更改软件,例如一个人在同一任务中执行两个子任务。请记住,如果有意义的话,数据库中的一行是一段数据或“一件事”。至少,您会获得时间戳。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多