mysql - Ruby on Rails:两个模型都有 Has/Many 和 Belongs_to
问题描述
我最近继承了一个旧的 rails 应用程序,它有一个名为Package
. 其中一项任务是能够允许删除包。PackageState
但是,由于和Package
模型的设置方式,这目前是不可能的。这是一个例子:
封装型号:
class Package < ActiveRecord::Base
belongs_to :package_state, class_name: 'PackageState', foreign_key: :package_state_id
has_many :package_states
end
和 PackageState:
class PackageState < ActiveRecord::Base
has_many :packages, :class_name => 'Package'
end
重组的最佳方式是什么
解决方案
您所描述的是 and 之间的单向has_and_belong_to_many ( HABTM) 关联,如下所示:Package
PackageState
class Package < ActiveRecord::Base
has_and_belongs_to_many :package_states
end
class PackageState < ActiveRecord::Base
has_many :packages
end
这个SO question的公认答案有以下关于单向 HABTM 关联的摘录:
功能上是,但语义上不是。以“片面”的方式使用 HABTM 将完全实现您想要的。不幸的是,HABTM 这个名字确实暗示了一种并非总是如此的互惠关系。同样,belongs_to :foo 在这里也没有什么直观意义。
不要陷入 HABTM 和其他关联的语义中,而只需考虑您的 ID 需要放在哪里,以便适当且有效地查询数据。请记住,效率考虑首先应考虑您的生产力。
你还说
PackageState
由于和Package
模型的设置方式,这目前是不可能的
但这是不正确的。没有什么能阻止您使用ActiveRecord
和调用destroy
它来获取包对象。
您应该问自己打算如何使用这两种模型(尤其是在删除包时)并确定哪种关联效果最好。考虑到这是一个继承的应用程序,您可能需要处理遗留数据,但这是另一天的话题。
推荐阅读
- gtk - 将 Surface 转换为矢量化 SVG 而不是嵌入的 PNG
- r - 用 1 代替刻度线√
- python - 如何获取用户的角色 discord.py
- python - 如何使用 MySQL-Connector 从 Python 中的 MySQL 存储过程中检索 out 参数?
- dc.js - 连接两个 json 对象时无法显示绘图
- c++ - 如何在 C++ 模板中调用类的构造函数?
- mac-catalyst - 调整窗口大小时未调用 didUpdate
- html - 在 Swift 中从 HTML 字符串中提取多个元素
- facebook-opengraph - Facebook 爬虫 cURL:AWS CLoudFront 上的 28 (OPERATION_TIMEOUTED)
- c++ - 如何在 C++ 中使用 UTF-8 和 Unicode?C++20 char8_t 有多大?