Ruby on rails 将子容器传递给父类型的容器
在我的rails应用程序中,我有一个父类个人和子类学生和教授 继承由一个名为“acts_as_relation”的gem处理,它模拟多表继承 此外,我还有一个动作,其中一个学生实例被附加到一个个人列表中。正常情况下,我希望这不会出现任何问题,但我得到了以下错误:Ruby on rails 将子容器传递给父类型的容器,ruby-on-rails,Ruby On Rails,在我的rails应用程序中,我有一个父类个人和子类学生和教授 继承由一个名为“acts_as_relation”的gem处理,它模拟多表继承 此外,我还有一个动作,其中一个学生实例被附加到一个个人列表中。正常情况下,我希望这不会出现任何问题,但我得到了以下错误: ActiveRecord::AssociationTypeMismatch: Individual(#70220161296060) expected, got Student(#70220161349360) 以下是我的模型概览:
ActiveRecord::AssociationTypeMismatch: Individual(#70220161296060) expected, got Student(#70220161349360)
以下是我的模型概览:
class Individual < ActiveRecord::Base
acts_as_superclass
end
class Student < ActiveRecord::Base
acts_as :individual
end
class Professor < ActiveRecord::Base
acts_as :individual
end
class-Individual
我没有用过这个gem,只是想给你一些帮助,还有:
它们都提到您通过关系调用对象,这会混淆多态性或相似性。这两篇文章无法解决这个问题,我想这是因为他们可以找到正确的对象来处理他们的关系
进一步看,我发现:
充当关系
使用多态has\u one关联来模拟
多表继承。以电子商务为例,您可以
将产品声明为超级模特,所有类型的产品声明为
:product(如果您愿意,您可以使用其别名为_a和
是(一个超类)
或者像你在一个多态程序上那样声明它们属于关联
在这种情况下,您必须将名称传递给acts_,如:as选项:
change_表:产品没有|
t、 整数:可生产的\u id
t、 字符串:可生产的\u类型
结束
类Pen:可生产
结束
类目:可生产
结束
你确定你的数据表设置正确吗?我在项目中解决这个问题的方法是使用一些类的
实例。谢谢你的回答。我几乎可以肯定数据库没有问题。在设置gem之后,我用rails控制台检查了功能,并在数据库中插入了正确的内容。根据文档,很明显Book和Pen都在扩展ActiveRecord::Base,所以这可能就是我们要做的。宝石本身运作良好,直到我想把一个孩子的集合,这是家长类型…嗯-我希望我可以帮助,但我没有任何经验的宝石抱歉!谢谢你的回复。这确实可以解决问题,但我不想把“个人”称为教授、学生或任何其他未来的后代。
class Product < ActiveRecord::Base
acts_as_superclass
end
class Pen < ActiveRecord::Base
acts_as :product
end
class Book < ActiveRecord::Base
acts_as :product
end
create_table :products, :as_relation_superclass => true do |t|
# ...
end
change_table :products do |t|
t.integer :producible_id
t.string :producible_type
end
class Pen < ActiveRecord::Base
acts_as :product, :as => :producible
end
class Book < ActiveRecord::Base
acts_as :product, :as => :producible
end
p = Professor.create
a_model.individuals << p.individual
puts "#{a_model.individuals.first.class.name}"
=> Individual
puts "#{a_model.individuals.first.specific.class.name}"
=> Professor