2009-04-08 24 views
3

我明白STI是如何工作的,因爲我有一個Post模型, 包含論壇上的帖子和 'ordinaryUserPost'和'adminUserPost 「等Rails:單表繼承和發現(:所有)在父

現在,我想在每個子職位的定義相同的方法,但 方法會做一些在每種情況下不同的,例如

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 (:所有),它給了我需要呈現的帖子列表,但他們是 '發佈'的對象,而不是AdminUserPost或OrdinaryUserPost - 所以我不能 只是讓我的background_color方法!我會做一個找到 每種類型的單獨用戶後...

反正我可以這樣做:

Post.find(:all) 

,所得陣列中獲得AdminUserPost列表和 OrdinaryUserPost對象而不是Post對象?

或者有沒有一種很好的方式將我的Post對象根據需要轉換爲AdminUserPost和OrdinaryUserPost?

編輯:

可正常工作 - 只要你有一個在Post類被稱爲「類型」一欄。如果列被稱爲別的東西,如「post_type」,那麼你需要添加:

self.inheritance_column = 'post_type' 

中的所有子模型(AdminUserPost和OrdinaryUserPost在這個例子中)和父母(POST)。

謝謝,

Stephen。

+0

你有沒有在數據庫中的任何領域來區分哪些職位是哪種類型? – Miquel 2009-04-08 22:19:19

回答

7

仔細檢查posts表是否有'類型'(字符串)列。如果將AdminUserPosts和OrdinaryUserPosts寫入表'posts'並且類型列是正確的,則應該獲得您期望的子類行爲。

+0

我是個白癡!我的'type'列實際上被稱爲'post_type',所以我在CHILD模型中添加了self.inheritance_column ='post_type',但忘記將它添加到父項中 - 將它添加到父項中立即生效 - 謝謝! – 2009-04-09 21:48:49

-2

Post.find(:all)會給你Post,因爲你在Post中被serching,而不在AdminUserPost中。如果你想AdminUserPost使用:

AdminUserPost.find(:all) 

但我想它會找到Post.find(:所有)會找到相同的職位。

我認爲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社區新和我之前沒有聽說過性病。 dbarker是對的,我試過了,它按照你的想法工作。

+0

命名作用域不是我所尋找的,因爲這會導致兩個查詢。我希望能夠一次性獲得所有文章,並讓Rails將它們自動轉換爲正確的子類型! – 2009-04-08 23:02:05

+1

如果STI設置正確,Post.find(:all)將獲得所有的子類。 – 2009-04-08 23:24:28

1

如預期的那樣工作 - 只要在Post類中有一個名爲'type'的列。如果列被稱爲別的東西,如「post_type」,那麼你需要添加:

self.inheritance_column = 'post_type' 

中的所有子模型(AdminUserPost和OrdinaryUserPost在這個例子中)和父母(POST)。