我了解 STI 的工作原理,因为我说过一个 Post 模型
包含论坛上的帖子和几个子帖子,例如
'ordinaryUserPost' 和 'adminUserPost' 等。

现在,我想在每个子帖子中定义相同的方法,但是
该方法会在每种情况下做不同的事情,例如

class Post < ActiveRecord::Base
end

class AdminUserPost < Post
  def background_color
    'rockstar red'
  end
end

class OrdinaryUserPost < Post
  def background_color
    'pale blue'
  end
end

(是的,这是一个愚蠢的例子)。现在在我的线程 Controller 中我做 Post.find
(:all) 它给了我一个我需要渲染的帖子列表,但它们是
“发布”对象,而不是 AdminUserPost 或 OrdinaryUserPost - 所以我不能
只需获取我的 background_color 方法!我将不得不做一个发现
每种类型的用户帖子分别......

无论如何我可以做:
Post.find(:all)

并在结果数组中获取 AdminUserPost 和
普通UserPost 对象而不是 Post 对象?

或者是否有一种很好的方法可以将我的 Post 对象适本地“转换”到 AdminUserPost 和 OrdinaryUserPost 中?

编辑:

这按预期工作 - 前提是您在 Post 类中有一个名为“type”的列。如果您的列被称为其他名称,例如“post_type”,那么您需要添加:
self.inheritance_column = 'post_type'

在所有子模型(本例中为 AdminUserPost 和 OrdinaryUserPost)和父模型(Post)中。

谢谢,

斯蒂芬。

最佳答案

仔细检查帖子表是否有一列“类型”(字符串)。如果 AdminUserPosts 和 OrdinaryUserPosts 被写入表 'posts' 并且类型列是正确的,你应该得到你期望的子类行为。

关于ruby-on-rails - Rails : Single table inheritance and find(:all) in parent,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/732077/

10-13 02:09