我有两个模型,Article和Recipe,它们有一堆相同的属性和方法。我想创建一个新类“Post”的子类,并在那里移动所有共享逻辑,所以我不维护重复的代码。我试过这个:
class Recipe < Post; end
class Article < Post; end
class Post < ActiveRecord::Base
#all the shared logic
end
所有这些类都在标准的./app/models文件夹中。但是,当我转到/ articles / new时,此代码会抛出ActiveRecord :: StatementInvalid错误。错误是:
无法找到表'帖子'
知道如何设置吗?
答案 0 :(得分:13)
Rails默认使用Single Table Inhritance模式(只是google for it),因此当您对模型进行子类化时,所有生成的模型将使用相同的数据库表(在本例中为posts
)。您可以将所有常用方法和验证放在Post
模型中,将特定的方法和验证放在其他类中,但所有这些类都可以访问彼此的字段,因为它们共享同一个表(这不是一个大问题)虽然)。
如果您只想共享代码(方法),最好只将一些常用方法放入lib
目录中的文件中的模块中,并将其包含在每个模型中。或者,如果您将所有模型保存在单个文件中,则可以将模块定义放在顶部。
答案 1 :(得分: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"