加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 当它的超类是抽象的时,为什么rails不尊重与STI

发布时间:2020-12-17 03:00:08 所属栏目:百科 来源:网络整理
导读:我在我正在研究的rails应用程序中遇到了这个相当奇怪的行为. 我在继承heirarchy中有多种类型的Post,以及Post has_many FeedEntries. class Post ActiveRecord::Base has_many :feed_entriesendclass Post::BlogPost Post; endclass Post::Discussion Post; e
我在我正在研究的rails应用程序中遇到了这个相当奇怪的行为.

我在继承heirarchy中有多种类型的Post,以及Post has_many FeedEntries.

class Post < ActiveRecord::Base
    has_many :feed_entries
end

class Post::BlogPost < Post; end
class Post::Discussion < Post; end
class Post::Article < Post; end

class FeedEntry < ActiveRecord::Base
    belongs_to :post
end

现在,当我像以前一样设置所有内容时,在保存的对象上调用FeedEntry#post总是返回正确(子类)类型的对象,正如我所期望的那样.但是,如果我使Post摘要(它确实应该是 – 在这个模型中永远不应该实例化超类):

class Post < ActiveRecord::Base
    has_many :feed_entries
    self.abstract_class = true
end

_(注意:我编辑了这段代码片段以考虑下面的tomafro建议,因为设置self.abstract_class似乎比覆盖self.abstract_class更惯用?但是,相同的行为仍然存在.)

…然后在先前保存的对象上调用FeedEntry#post关联返回Post类型的对象.这看起来相当倒退(假设抽象类声明明确表示该类不应该被实例化),我想不出这种行为的原因.

那么,有什么理由我没有得到,或者它是一个错误,还是其他什么?

解决方法

通过在基础对象中指定self.abstract_class = true,您实际上是禁用STI.设置self.abstract_class = true实际上告诉ActiveRecord没有与该类关联的数据库表,因此您继承的类将各自拥有自己的数据库表.

听起来你想要做的就是删除self.abstract_class = true并使用initialize方法模拟一个抽象类,如果类不是Post类型,则只允许实例化.

例如:

class Post < ActiveRecord::Base    
  def initialize 
    raise "Post cannot be instantiated directly" if self.class == Post   
  end
end

这样,您可以维护STI模型并具有伪抽象基类.希望这可以帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读