我理解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)。
谢谢,
斯蒂芬。
答案 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是对的,我尝试了它,它可以按你的需要工作。