2011-01-31 7 views
7

同じ属性とメソッドの束を持つ記事とレシピという2つのモデルがあります。私は、新しいクラス "Post"のサブクラスを作成し、そこにすべての共有ロジックを移動して、重複したコードを保持しないようにしたいと思います。私はこれを試してみた:Railsでモデルをサブクラス化する

class Recipe < Post; end 
class Article < Post; end 
class Post < ActiveRecord::Base 
    #all the shared logic 
end 

これらのクラスのすべてが標準./app/modelsフォルダにあります。しかし、このコードでは、たとえば/ articles/newに移動するとActiveRecord :: StatementInvalidエラーがスローされます。エラーは次のとおりです。

はどのようにこれを設定するには、表「投稿の

任意のアイデアを見つけることができませんでしたか?

+1

しかし、あなたは 'posts'テーブルを作りましたか? – Matt

答えて

9

なぜモジュールを使用しないのですか?

module Features 
    def hello 
    p "hello" 
    end 
end 

class Recipe < ActiveRecord::Base 
    include Features 
end 

class Article < ActiveRecord::Base 
    include Features 
end 


Recipe.new.hello 
# => "hello" 

Article.new.hello 
# => "hello" 
+0

それは完璧です。私はレールが新しく、そのことについて知らなかった。ちょうどhttp://handyrailstips.com/tips/14-drying-up-your-ruby-code-with-modulesを読んで、それは理にかなっています。ありがとう! – weotch

13

Railsは(ちょうどそれをグーグル)はデフォルトでシングル表Inhritanceパターンを使用しているので、あなたがモデルをサブクラス化しているとき、すべての結果のモデルは、(この場合はpostsに)同じデータベースのテーブルを使用します。 Postモデルではすべての一般的なメソッドと検証を入れ、他のクラスでは特定のクラスを指定できますが、同じテーブルを共有しているため、これらのクラスはそれぞれのフィールドにアクセスできます(大きな問題ではありません)。

コード(メソッド)を共有したいのであれば、いくつかの一般的なメソッドをlibディレクトリにあるファイルのモジュールに入れて、各モデルに含める方がよいでしょう。または、例のようにすべてのモデルを単一のファイルに保存している場合は、モジュール定義を一番上に置くこともできます。

+0

理由を説明してくれてありがとう! – ifightcrime

関連する問題