2009-04-08 23 views
3

にフォーラムと複数のサブ投稿の投稿が含まれている投稿モデルがSTIの仕組みを理解しています。 'ordinaryUserPost'と 'adminUserPost "などRails:親テーブル内の単一のテーブル継承とfind(:all)

は今、私は、例えば

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ではなくPostのオブジェクトです - だから私は 私のbackground_color方法!

Post.find(:all) 

を得られた配列にAdminUserPostのリストと OrdinaryUserPostオブジェクトを取得:私は

私が行うことができますとにかくあります... 別途ユーザー投稿の各タイプに検索を行う必要があります投稿オブジェクトの代わりに?

または適切なAdminUserPostとOrdinaryUserPostの私の投稿オブジェクトを 'キャスト'するいい方法がありますか?

EDIT:予想通り

これは動作します - あなたはPostクラスに「タイプ」という列を持っていました。

self.inheritance_column = 'post_type' 

(この例ではAdminUserPostとOrdinaryUserPost)すべての子モデルではと親(ポスト)に:あなたの列は、このような「post_type」のように何かを、と呼ばれているなら、あなたは追加する必要があります。

ありがとう、

スティーブン。

+0

DBにはどの種類の投稿があるかを区別するためのフィールドがありますか? – Miquel

答えて

7

投稿テーブルに 'type'(文字列)列があることを再度確認します。 AdminUserPostsとOrdinaryUserPostsがテーブル 'posts'に書き込まれ、型の列が正しい場合は、期待するサブクラスの動作を取得する必要があります。

+0

私はばかです!私の 'type'カラムは実際に 'post_type'と呼ばれていたので、childモデルにself.inheritance_column = 'post_type'を追加しましたが、親に追加するのを忘れました。 –

-2

Post.find(:all)は、AdminUserPostではなく、PostでSerchingしているので、Postを与えます。 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

EDIT:

私はRailsのコミュニティで新たなんだと私は前にSTIを聞いていなかった、ごめんなさい。 dbarkerはそうです、私はそれを試して、あなたが望むように動作します。

+0

名前付きスコープは、2つのクエリになると私が探しているものではありません。すべての投稿を1つにまとめて、Railsが正しい子タイプに自動翻訳する方法を期待していました。 –

+1

STIが正しく設定されている場合、Post.find(:all)はすべてのサブクラスを取得します。 –

1

これは期待どおりに動作します - Postクラスに 'type'という列があることを条件とします。

self.inheritance_column = 'post_type' 

(この例ではAdminUserPostとOrdinaryUserPost)すべての子モデルではと親(ポスト)に:あなたの列は、このような「post_type」のように何かを、と呼ばれているなら、あなたは追加する必要があります。

関連する問題