我知道这方面的帖子数量,但我仍然不知道该怎么做。我有一个模型“InspirationItem”,它基本上是一篇博文。现在我还想要第二个模型,“Special”。特价商品类似于灵感项目,但它们具有额外的属性,例如“摘录”和“主题”。所以我想扩展“InspirationPost”模型。
我试图创建一个模型“Post”,“InspirationItem”和“Special”都扩展了它,但“InspirationItem”并没有真正添加任何属性。然后,我从 InspirationItem/Special 创建一个“has_one”关系,并尝试使用“delegate”来处理“Post”模型中的所有逻辑。然而,这根本不像我预期的那样有效。
这是我的一些代码。这将是我的 InspirationItem:
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 也返回 Specials,这就是我使用 Post 模型的原因。我还希望常规错误处理适用于所有模型。提前致谢!
最佳答案
如果您想要一个模型的 ActiveRecord 子类,但不希望父类搜索任何子类,那么这样的事情应该可行(我将使用您的 InspirationItem
类):
class InspirationItem < ActiveRecord::Base
def self.descendants
super.reject {|klass| klass == Special}
end
end
class Special < InspirationItem
end
这有点 hacky,但会强制 ActiveRecord 在您搜索 InspirationItem.all
时仅返回 InspirationItems。这不应该影响验证。
编辑:回复:表格看起来像什么。
create_table :inspiration_items do |t|
t.string :type # needed for the Single Table Inheritance mechanism
# whatever other columns you need for InspirationItems
end
关于ruby-on-rails - 如何从 Rails 中的模型继承,其中一种类型在不交织的情况下扩展另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9243438/