我有一个名为Post
的小组:
class Post < ActiveRecord::Base
end
我有一个名为Question
的类,它继承自Post
:
class Question < Post
end
我有一个名为Answer
的类,它也继承自'Post':
class Answer < Post
end
在Post
中,我有一个名为post_type_id
的列,其类型为Integer
。
我如何使用STI和特定列名称&amp;从Post继承的类型? 0
表示Question
,1
表示Answer
。 (0&amp; 1是posts表中post_type_id
的值)
答案 0 :(得分:23)
您可以更改单表继承列的名称,如下所示:
class Post < ActiveRecord::Base
self.inheritance_column = 'type_column_name'
end
但是,没有办法让Rails使用整数而不是将实际类型存储为字符串,这使我认为这可能不是单目标继承的一个很好的用例。也许范围更适合你:
class Post < ActiveRecord::Base
scope :questions, where(:post_type_id => 0)
scope :answers, where(:post_type_id => 1)
end
@questions = Post.questions.all
@answers = Post.answers.all
答案 1 :(得分:8)
实际上有一种方式,就像所有事情一样。您可以覆盖find_sti_class方法以根据整数查找类型。
答案 2 :(得分:3)
这可能是您正在寻找的。 p>
http://lorefnon.me/2014/07/27/optimizing-sti-columns.html
编辑:更新了网址(感谢@SubhashChandran)
答案 3 :(得分:0)
您将需要使用self.inheritance_column设置列类型 然后,您将必须为以下方法提供自己的行为:位于该文件“ activerecord / lib / active_record / inheritance.rb”中的“ sti_class_for(type_name)”
所以您将不得不猴子修补以上文件。
这不是推荐的方法,您将必须进行迁移并更改所有值以匹配您的类名。