在ActiveRecord :: Base子类中设置table_name

时间:2013-04-29 20:01:03

标签: ruby-on-rails activerecord

我有一个抽象类:

class AbstractBrowsable < ActiveRecord::Base  
  self.abstract_class = true
  attr_accessible :heading
  [...]
  def get_following(count)
    AbstractBrowsable.where("heading > ?", self.heading).order('heading ASC').limit(count)
  end
end

它有一些像上面那样的通用查询,所以在子类中我需要设置表名,例如。

class Subject < AbstractBrowsable
  AbstractBrowsable.table_name = "subjects"
end

我可以让它工作的''唯一'方式如上所示,即AbstractBrowsable.table_name = "subjects"而非self.table_name = 'subjects'。这对我来说似乎很可疑,而我的Google-Fu只使用self.显示了示例。这样可以,或者我错过了什么?

如果你还没有猜到,我是Ruby / Rails的新手;任何帮助非常感谢。我的Rails版本是3.2.13,Ruby是1.9.3。

1 个答案:

答案 0 :(得分:1)

你应该使用self,除非你试图做STI,在这种情况下你不需要设置abstract_class。

- 编辑 -

根据您在评论中描述的内容,您需要将功能构建到模块中并将其包含在您的课程中。这是Ruby中模块的目的。

建议阅读:http://37signals.com/svn/posts/3372-put-chubby-models-on-a-diet-with-concerns

以下是一个例子:

module Browsable
  # Browsable methods
end

class Subject < ActiveRecord::Base
  include Browsable
  # 
end