所以这或多或少是我正在尝试的:
我为所有常见功能提取了一个抽象类,其中包括一个多态关联,所以看起来像这样:
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<label>City:</label>
<input type="text" id="search-input" />
<button type="button" id="search-button">Search</button>
<div id="venue-result"></div>
</body>
</html>
现在,当我尝试在其上使用多态关联时,出现以下情况:
class Card < ActiveRecord::Base
self.abstract_class = true
belongs_to :cardable, polymorphic: true
...
end
class Spell < Card
...
end
class Unit < Card
...
end
事物的 class Deck < ActiveRecord::Base
has_many :cards, :as => :cardable
end
class Hand < ActiveRecord::Base
has_many :cards, :as => :cardable
end
部分工作正常,
即belongs_to
可以按预期完美运行
但是,由于有抽象类,spell.cardable
不能很好地工作
即has_many
或hand.cards
总是给出一个空的ActiveRecord关联
这是可行的模型吗?如果不是,那么对整个场景进行建模的更好方法是什么?
答案 0 :(得分:1)
您可以使用初始化程序来模拟抽象类
class Card < ActiveRecord::Base
def initialize
raise "Card cannot be instantiated directly" if self.class == Card
end
belongs_to :cardable, polymorphic: true
...
end
您维护自己的STI并拥有伪抽象类 请在stackoverflow上阅读以下comment:
答案 1 :(得分:0)
@JoshKurien听起来好像您已经回答了自己的问题“它不需要相应的表”,但是对于您而言,cards
不是数据库中的实际表吗?如果是这样,请摆脱这行,因为它显然破坏了ActiveRecord
self.abstract_class = true
也许更好的方法是只将具有数据库表的每个模型类定义为常规模型。如果您需要模型中的共享行为,是否可以使用模型关注点并从共享关注点扩展这些模型?
请参见How to use concerns in Rails 4
但是有些人认为担忧是一个糟糕的设计,在这种情况下,您可能还想看看https://github.com/AndyObtiva/super_module作为另一种选择。