Rails:单表继承和在父级中查找(:all)

时间:2009-04-08 22:07:44

标签: ruby-on-rails ruby

我理解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

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

无论如何我能做到:

Post.find(:all)

在结果数组中获取AdminUserPost和的列表 OrdinaryUserPost对象而不是Post对象?

或者有一种很好的方法可以将我的Post对象“转换”为AdminUserPost和OrdinaryUserPost吗?

编辑:

这可以按预期工作 - 只要在Post类中有一个名为'type'的列。如果您的列被称为其他内容,例如'post_type',则需要添加:

self.inheritance_column = 'post_type'

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

谢谢,

斯蒂芬。

3 个答案:

答案 0 :(得分:7)

仔细检查posts表是否有列'type'(字符串)。如果将AdminUserPosts和OrdinaryUserPosts写入表'posts'并且type列正确,则应该获得所期望的子类行为。

答案 1 :(得分:1)

这可以按预期工作 - 只要在Post类中有一个名为'type'的列。如果您的列被称为其他内容,例如'post_type',则需要添加:

self.inheritance_column = 'post_type'

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

答案 2 :(得分:-2)

Post.find(:all)会给你发帖,因为你正在发帖,而不是在AdminUserPost。如果您想使用AdminUserPost:

AdminUserPost.find(:all)

但我想它会找到与Post.find(:all)相同的帖子。

我认为named_scope会帮助你:

# in model
Class Post << ActiveRecord::Base
  named_scope :admin_posts, :conditions => {:owner == 'admin'}
  named_scope :ordinary_user_posts, :condition => {:owner != 'admin'}
end

# in controller
@posts = Post.admin_posts # returns admin posts

# or
@posts = AdminUserPost.admin_posts # returns admin posts in AdminUserPost class 

我没有尝试使用这个继承的类,但我认为它会起作用。

您可以在此处详细了解命名范围:http://railscasts.com/episodes/108-named-scope

编辑:

对不起,我是Rails社区的新手,之前我没有听说过STI。 dbarker是对的,我尝试了它,它可以按你的需要工作。