【问题标题】:Ruby on Rails: Two Models Both Have Has/Many and Belongs_toRuby on Rails:两个模型都有 Has/Many 和 Belongs_to
【发布时间】:2018-08-09 15:53:36
【问题描述】:

我最近继承了一个旧的 Rails 应用程序,它的模型名为 Package。其中一项任务是能够允许删除包。但是,由于PackageStatePackage 模型的设置方式,这目前是不可能的。这是一个例子:

封装型号:

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

重组的最佳方式是什么

【问题讨论】:

  • “由于 PackageState 和 Package 模型的设置方式,目前不可能” - 究竟是什么问题/问题?尝试删除时是否遇到错误?如果是这样,它们是什么?如果不是,目前的行为是什么?

标签: mysql ruby-on-rails ruby database


【解决方案1】:

您所描述的是PackagePackageState 之间的单向has_and_belong_to_many (HABTM) association,如下所示:

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 需要放在哪里,以便适当且高效地查询数据。请记住,效率因素首先应考虑到您的生产力。

你也说过

由于PackageStatePackage 模型的设置方式,这目前是不可能的

但那是不正确的。没有什么能阻止您使用 ActiveRecord 获取包对象并在其上调用 destroy

您应该问自己打算如何使用这两种模型(尤其是在删除包时),并确定哪种关联效果最好。考虑到这是一个继承的应用程序,您可能需要处理遗留数据,但这是另一天的话题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多