self.table_name不起作用

时间:2015-10-24 10:20:16

标签: ruby-on-rails model migration

我正在尝试学习rails Active Record。 据悉,setRetainInstance(true)可用于重命名rails创建默认值的表。

self.table_name

但是当我第一次运行迁移时,我仍然得到class Order < ActiveRecord::Base self.table_name = "ordered" end 表,而不是我在字符串中提到的表。在这里犯了什么错误?

迁移:

orders

1 个答案:

答案 0 :(得分:1)

class CreateOrders < ActiveRecord::Migration
  def change
    create_table :ordered do |t|
      t.timestamps null: false
    end
  end
end

这将创建一个ordered表。

如果您已经拥有orders表,则可以使用以下内容:

$ rails g migration ChangeOrdersToOrdered

#db/migrate/change_orders_to_ordered_______.rb
class ChangeOrdersToOrdered < ActiveRecord::Migration
   rename_name :orders, :ordered
end

$ rake db:migrate

表格!=类

您必须记住迁移不同 - 它们是互斥的。

虽然命名约定相似,并且Rails在连接两者方面做得很好,但事实仍然是你可以随意调用你的表 - 它与你的模型无关除非您专门指定与模型相关联的表格。

设置self.table_name仅设置模型将读取的类(它是class method):

  

根据直接从ActiveRecord :: Base递减的继承层次结构中的类名称,猜测表名(强制小写)。因此,如果层次结构如下:Reply < Message < ActiveRecord::Base,则Message用于猜测表名,即使在回复时调用也是如此。用于进行猜测的规则由Active Support中的Inflector类处理,该类知道几乎所有常见的英语变形。您可以在config/initializers/inflections.rb

中添加新的变形

这意味着无论您在self.table_name中提到什么,您都可以使用您想要的任何迁移。