Ruby on rails 如何从Rails中的模型继承,其中一种类型扩展另一种类型而不相互缠绕

Ruby on rails 如何从Rails中的模型继承,其中一种类型扩展另一种类型而不相互缠绕,ruby-on-rails,inheritance,activerecord,associations,Ruby On Rails,Inheritance,Activerecord,Associations,我知道这上面有很多帖子,但我还是不知道怎么做。我有一个模型InspirationItem,它基本上是一个博客帖子。现在我还想要第二款,特别款。特价商品就像灵感一样,但它们有额外的属性,比如摘录和主题。所以我想扩展InspirationPost模型 我曾尝试创建一个模型帖子,它同时包含InspirationItem和Special extend,但InspirationItem并没有为其添加任何属性。然后,我从InspirationItem/Special创建了一个has_one关系,并尝试使用委

我知道这上面有很多帖子,但我还是不知道怎么做。我有一个模型InspirationItem,它基本上是一个博客帖子。现在我还想要第二款,特别款。特价商品就像灵感一样,但它们有额外的属性,比如摘录和主题。所以我想扩展InspirationPost模型

我曾尝试创建一个模型帖子,它同时包含InspirationItem和Special extend,但InspirationItem并没有为其添加任何属性。然后,我从InspirationItem/Special创建了一个has_one关系,并尝试使用委托来处理Post模型中的所有逻辑。然而,这并不像我期望的那样有效

这是我的一些代码。这将是我的灵感项目:

class InspirationItem < ActiveRecord::Base
    has_one :post, :as => :item

    delegate            :title, :title=,
                        :body, :body=,
                        :category_names, :category_names=,
                        :hide_from_overview, :hide_from_overview=,
                        :to => :post, :allow_nil => true

end
这是一篇短文:

class Post < ActiveRecord::Base

    attr_accessible :title, :body, :embed, :hide_from_overview, :visual, :thumbnail, :category_names
    # All sorts of logics
end

重要的是,我不希望InspirationItem.all也返回特价,这就是我使用Post模型的原因。我还希望对所有模型进行常规错误处理。提前谢谢

如果您想要一个模型的ActiveRecord子类,但不想让父类搜索任何子类,那么类似的方法应该可以实现我将使用您的InspirationItem类:


您研究过单表继承吗?这可能比试图通过关系将帖子模型包括在你的灵感项目中更有意义。是的,我有,但“特殊”比“灵感”有更多的属性,所以我认为我会很难看,因为有这么多空的灵感实例栏。好吧,我最终还是按照你的建议做了。现在不用创建关系,而是使用posts表。过早优化是万恶之源-Donald Knuth。除非空列是您的问题,否则请选择一组易于编码的模型。如果从长远来看,稀疏数据库成为一个问题,您可以尝试在数据库中缓和它;我是这样做的,很有魅力。谢谢。看起来不错,在这种情况下,我的表是什么样子的?我刚刚用InspirationItems类的表是什么样子更新了我的答案。因为Special是InspirationItem的一个子类,所以它们将使用相同的数据库表。这太棒了,谢谢。我仍然创建了一个资源帖子,InprirationItem和Special都继承了它,而不是self.desendants魔法。这样,我就可以选择Post.all,这是一个在未来会变得相关的场景。是的,这是一个神奇的场景,我很高兴你能够避免它。对这两个类使用一个公共超类肯定是一个更好的主意。
class InspirationItem < ActiveRecord::Base
  def self.descendants
    super.reject {|klass| klass == Special}
  end
end

class Special < InspirationItem
end
create_table :inspiration_items do |t|
  t.string :type # needed for the Single Table Inheritance mechanism
  # whatever other columns you need for InspirationItems
end