Модели подклассов в Rails - PullRequest
       3

Модели подклассов в Rails

7 голосов
/ 31 января 2011

У меня есть две модели, Article и Recipe, которые имеют множество одинаковых атрибутов и методов. Я хочу создать подклассы нового класса "Post" и переместить туда всю их общую логику, чтобы не поддерживать дублирующийся код. Я пробовал это:

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

Все эти классы находятся в стандартной папке ./app/models. Этот код, однако, выдает ошибку ActiveRecord :: StatementInvalid, когда я, например, захожу в / article / new. Ошибка:

Не удалось найти таблицу 'posts'

Есть идеи, как это настроить?

Ответы [ 2 ]

13 голосов
/ 31 января 2011

Rails использует шаблон Single Table Inhritance по умолчанию (просто Google для него), поэтому, когда вы создаете подкласс для модели, все получающиеся модели будут использовать одну и ту же таблицу базы данных (в данном случае posts).Вы можете поместить все свои общие методы и проверки в модель Post, а также в другие классы, но все эти классы будут иметь доступ к полям друг друга, потому что они совместно используют одну и ту же таблицу (хотя это не большая проблема).

Если вы просто хотите поделиться кодом (методами), вам лучше просто поместить некоторые общие методы в модуль в файле в каталоге lib и включить его в каждую модель.Или вы можете поместить определение модуля вверху, если вы храните все модели в одном файле, как в вашем примере.

9 голосов
/ 31 января 2011

Почему вы не используете модули?

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"
...