ruby-on-rails - 如何从 Rails 中的模型继承,其中一种类型在不交织的情况下扩展另

我知道这方面的帖子数量,但我仍然不知道该怎么做。我有一个模型“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/

相关文章:

.net - 如何设置 "user cannot change password"AD属性

cuda - 在 Cmake 项目中指定 openmp CUDA 标志

visual-studio-2010 - Visual Studio 2010 中缺少添加可部署程序

python - subprocess.Popen 不是线程安全的?

sql - 查找某个点之后或之前的值

php - php中var-export函数的反义词是什么?

c# - 在 IIS 服务器上发布 C# 控制台应用程序

mysql - 导入mysql数据中断,如何恢复?

hive - 使用 Apache Hive session 化我的日志数据的更好方法?

ruby-on-rails - 设计注册表单的路线