Rails中与抽象类的多态关联

时间:2019-03-09 20:40:08

标签: ruby-on-rails ruby associations polymorphic-associations

所以这或多或少是我正在尝试的:

我为所有常见功能提取了一个抽象类,其中包括一个多态关联,所以看起来像这样:

<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_manyhand.cards总是给出一个空的ActiveRecord关联

这是可行的模型吗?如果不是,那么对整个场景进行建模的更好方法是什么?

2 个答案:

答案 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作为另一种选择。