我最近继承了一个较旧的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
和包状态:
class PackageState < ActiveRecord::Base
has_many :packages, :class_name => 'Package'
end
重组的最佳方法是什么
您描述的是Package
和PackageState
之间的单向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需要位于何处,以便适当有效地查询数据。请记住,效率考虑首先应该考虑您的生产力。
你还说
由于
PackageState
和Package
模型的设置方式,目前无法做到这一点
但这是不正确的。没有什么能阻止您使用 ActiveRecord
获取包对象并在其上调用 destroy
。
您应该问问自己打算如何使用这两种模型(尤其是在删除包时(,并确定哪种关联效果最好。考虑到这是一个继承的应用程序,您可能需要处理遗留数据,但这是另一天的主题。