【问题标题】:Whats the point of ActiveRecord associations?ActiveRecord 关联的意义何在?
【发布时间】:2019-11-08 02:36:28
【问题描述】:

我还是 Rails 的新手,我仍然不明白为什么人们在 ActiveRecord 中使用关联。

例如,如果我有一个类别 Patient 和一个类别 Doctor他们的医生 ID。同样,如果我想查找分配给患者的医生的姓名,我会找到患者医生 ID 等于医生 ID 的医生。

我可以在不使用关联的情况下明确而简单地完成所有这些工作。

从我的角度来看,ActiveRecord 关联只会使这复杂化,使用它而不是手动使用我自己的 ID 系统有什么好处?

【问题讨论】:

  • 您是在询问 Rails 中的关联还是关系数据库的意义何在?关联只是关系查询的快捷方式,所以我对这个问题的提出方式有点困惑

标签: ruby-on-rails activerecord


【解决方案1】:

如果我理解您的问题,您实际上是在描述一种关联 - 一对多。 Rails 允许您自动执行此操作,这样您就不必编写 SQL 来计算医生拥有的患者数。因此,无需打开数据库连接、执行 SQL 以及解析和计算结果集,您只需找到将相关医生分配给my_dr,然后执行my_dr.patients.count

您会从多对多关联中看到更大的好处,其中手动编写 SQL 涉及与链接表连接。例如,医生有很多病人,病人可能有多个医生。因此,除了Doctor 模型和Patient 模型之外,您还需要一个DoctorPatient 模型来保持两者之间的连接。用于此的 SQL 比您在第一个示例中所需的要长,但 rails 仍然允许您使用 my_dr.patients 来检索和迭代医生的患者。

因此,这样做的好处是避免了自己编写 SQL。我可以使用 SQL,但与实际的编程语言语法相比,我发现它是喜怒无常且笨拙的,因此能够将数据库命令短路是一种实时和节能的方法。

【讨论】:

  • 是的,这个想法是您不必编写纯 SQL。如果 ActiveRecord 不存在,您将不得不编写相同的冗余查询(冗余的意思是唯一改变的是表/列名称)来检索许多不同表之间的关联。 Rails 通过 AR 关联为您做到这一点。
  • 别忘了dependent: :destroy 和朋友们。或扩展方法。
【解决方案2】:

是的,如果没有关联,您可以获得 Doctor 对象(名为 doctor)使用的患者数量:

Patient.where(doctor_id: doctor.id).count

但我不会说使用关联会使事情复杂化,而是通过以下方式简化事情:

doctor.patients.count

如果您不熟悉关联,并且您已经了解数据库,那么学习新事物似乎是一种额外的复杂性。但是,如果您使用它,使用一段时间后您会发现它简化了一些事情。

除了 has-many-through 之外,确实没有太大的收获,但是随着时间的推移,代码中有很多小的简化。

【讨论】:

  • 我不知道我会说joinsincludes 都提供了自己的巨大收益。比如Doctor.joins(patients:{records: :medications}).where(medications: {name: 'xyz'}).distinctDoctors开一个具体的Medication。这显然比使用基于 id 的数据集简单得多
  • @engineersmnky 好点。如果使用关联,可以参考joinsincludes
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多