繁体   English   中英

多态关联和外键引用可以引用相同的表。 如何制作新物品?

[英]Polymorphic association and foreign key reference can reference same table. How do I make a new object?

我所拥有的简化示例

class Apple < ActiveRecord::Base
  has_many :bananas, as: :bananable, dependent: destroy
  has_many :bananas
end

class Orange < ActiveRecord::Base
  has_many :bananas, as: :bananable, dependent: destroy
end

class Banana < ActiveRecord::Base
  belongs_to :bananable, polymorphic: true
  belongs_to :apple
end

所以香蕉可能属于苹果或橙子,但是无论如何都属于苹果通过外键关系。 这在水果的背景下似乎有点被迫,但实际的模型非常复杂,所以我简化了一些事情。 基本上,多态关联定义了Banana存在于其中的范围,但香蕉是Apple的一部分,无论其范围如何。

我遇到的问题是当我尝试创建一个新的香蕉时。 例如:

@Apple.bananas.new(valid_params)

这会在bananas表中设置apple_id外键列,但不会设置多态关联列(bananable_id和bananable_type)。 我发现设置两者的唯一方法是如上所述创建一个新的香蕉,然后在保存之前手动设置多态关联列。

有一个更好的方法吗?

也许是这样的:

@banana = @Apple.bananas.new(valid_params)
@Apple.bananables << @banana

或橙子

@banana = @Apple.bananas.new(valid_params)
@Orange.bananables << @banana

到目前为止,我想出的最好的是

@banana = @Apple.bananas.new(valid_params)
if params.has_key?(:orange_id)
  @banana.bananable = @orange
else
  @banana.bananable = @apple
end
@banana.save

您可以尝试在Banana模型中使用:inverse_of属性。 我知道Rails文档说这没有任何影响,但它确实在我之前的代码中做了一些帮助。 你可以试试,虽然我不保证。

belongs_to :bananable, polymorphic: true, inverse_of: :bananas

从我的笔记中,这有助于Rails理解关联与其反转之间的关系,这对我来说可以正确识别项目类型。

作为另一种选择,请务必检查验证是否违反了数据库更新。 为了测试,我不得不使用保存! 确保抛出异常,我可以发现隐藏的问题破坏了我的关联。

首先要清楚地了解多态关联。 Ruby on Rails指南指出“with polymorphic associations, a model can belong to more than one other model, on a single association”

我确信你不需要两个关联到同一个表。 每当你通过apple创建一个banana ,就不会设置bananable_idbananable_type因为rails通过apple_id找到关联,并且它不会打扰任何其他关联。

据我所知,你不必要地使你的模型复杂化。 我敢打赌,以下关联可以获得您需要的所有功能。

class Apple < ActiveRecord::Base
  has_many :bananas, as: :bananable, dependent: destroy
end

class Orange < ActiveRecord::Base
  has_many :bananas, as: :bananable, dependent: destroy
end

class Banana < ActiveRecord::Base
  belongs_to :bananable, polymorphic: true
end

如果您有任何有效的要点,说明为什么您需要两个相同型号的关联,请发表评论。

暂无
暂无

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

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