7

ArticleとRecipeの2つのモデルがあり、同じ属性とメソッドがたくさんあります。新しいクラス「Post」のサブクラスを作成し、それらのすべての共有ロジックをそこに移動して、重複したコードを維持しないようにします。私はこれを試しました:

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

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

テーブル「投稿」が見つかりませんでした

これを設定する方法はありますか?

4

2 に答える 2

13

Rails はデフォルトで Single Table Inhritance パターンを使用しているため (Google で調べてください)、モデルをサブクラス化すると、結果のすべてのモデルが同じデータベース テーブル (この場合はposts) を使用します。すべての一般的なメソッドと検証をPostモデルに配置し、特定のものを他のクラスに配置できますが、これらのクラスはすべて、同じテーブルを共有するため、互いのフィールドにアクセスできます (ただし、大きな問題ではありません)。

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

于 2011-01-31T15:48:06.547 に答える
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"
于 2011-01-31T15:33:05.883 に答える