如何自定义Rails 3 STI列名

时间:2012-02-26 16:03:00

标签: ruby-on-rails

我有一个名为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表示Question1表示Answer。 (0&amp; 1是posts表中post_type_id的值)

4 个答案:

答案 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)

这可能是您正在寻找的。

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)”

所以您将不得不猴子修补以上文件。

这不是推荐的方法,您将必须进行迁移并更改所有值以匹配您的类名。