ActiveRecord忽略table_name_prefix

时间:2015-03-20 19:56:18

标签: ruby activerecord

我遇到需要在模型中定义table_name和table_name_prefix的情况,由于某种原因,table_name会覆盖table_name_prefix。

class ScheduleItem < ActiveRecord::Base
  self.table_name = "schedule_item"
  self.table_name_prefix = 'ACQ_IBM_T.'
end

查询中完全忽略前缀。但是,当我注释掉table_name部分时,会添加前缀。以前有人见过这种奇怪的行为吗?

1 个答案:

答案 0 :(得分:4)

ActiveRecord::ModelSchema::ClassMethods中,table_name setter将值放入@table_name

def table_name=(value)
  ...
  @table_name        = value

如果定义table_name getter只使用@table_name值:

def table_name
  reset_table_name unless defined?(@table_name)
  @table_name
end

table_name_prefix仅用于帮助Rails尝试根据类名猜测表名(在reset_table_name中)。

如果你有一个Rails无法猜到的表名,你可以这样做:

class ScheduleItem < ActiveRecord::Base
  self.table_name = "ACQ_IBM_T.schedule_item"

或者如果您需要在其他地方使用前缀,您可以这样做:

class ScheduleItem < ActiveRecord::Base
  self.table_name_prefix = 'ACQ_IBM_T.'
  self.table_name = "#{table_name_prefix}schedule_item"