繁体   English   中英

Ruby on Rails:两种模型都有Has / Many和Belongs_to

[英]Ruby on Rails: Two Models Both Have Has/Many and Belongs_to

我最近继承了一个较旧的Rails应用程序,该应用程序具有一个名为Package的模型。 任务之一是能够删除软件包。 但是,由于PackageStatePackage模型的设置方式,目前PackageState无法实现。 这是一个例子:

包装型号:

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

什么是进行重组的最佳方法

您正在描述的是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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM