Ruby on Rails:两种型号都有 has/many 和 Belongs_to



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

包装型号:

class Package < ActiveRecord::Base
  belongs_to :package_state, class_name: 'PackageState', foreign_key: :package_state_id
  has_many :package_states
end

和包状态:

class PackageState < ActiveRecord::Base
  has_many :packages, :class_name => 'Package'
end

重组的最佳方法是什么

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

class Package < ActiveRecord::Base
  has_and_belongs_to_many :package_states
end
class PackageState < ActiveRecord::Base
  has_many :packages
end

这个SO问题的公认答案有关于单向HABTM关联的摘录:

功能上是,但语义上不是。以"片面"的方式使用HABTM将完全实现您想要的。不幸的是,HABTM这个名字确实暗示了一种互惠关系,但情况并非总是如此。同样,belongs_to :foo 在这里也没有什么直观的意义。

不要纠结于HABTM和其他关联的语义,而只需考虑ID需要位于何处,以便适当有效地查询数据。请记住,效率考虑首先应该考虑您的生产力。

你还说

由于PackageStatePackage模型的设置方式,目前无法做到这一点

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

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

相关内容

  • 没有找到相关文章

最新更新