7

我有两个模型,文章和食谱,它们有一堆相同的属性和方法。我想创建一个新类“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 回答