1

我把我的 Rails 数据库弄乱了,当时有点迷茫。当我意识到我的一个表名不像其他表名那样以 ' 结尾时,一切都开始了。(我真的不知道为什么,因为我所有的其他表都以's'为前缀)所以我尝试重命名它并进行了迁移:

rename_table :funnel_data, :funnel_datas

有关信息,相应的模型称为FunnelData

class FunnelData < ActiveRecord::Base
   ...
end

所以迁移似乎完成了它的工作,并且没有错误地运行。

但是现在,在控制台中,我得到了以下信息:

2.0.0-p247 :014 > FunnelData
 => FunnelData(Table doesn't exist)

我检查了我的数据库,并且该表funnel_datas确实存在!

所以它引出了我的问题:Rails 应该如何知道表的“新”名称?我该如何解决我的情况?谢谢。


更新:好的,既然我知道“数据”是“数据”的复数形式,我回滚了我的迁移,并试图走自己的路,但现在我得到了一个奇怪的行为。

首先,让我们引入另一个类:

class FunnelStage < ActiveRecord::Base
    has_many :funnel_data
    (...)
end

我的控制台说:

2.0.0-p247 :046 > f = FunnelStage.first
  FunnelStage Load (0.3ms)  SELECT `funnel_stages`.* FROM `funnel_stages` ORDER BY `funnel_stages`.`id` ASC LIMIT 1
 => #<FunnelStage id: 1, name: "Inquiries", order: 100, created_at: "2013-09-14 23:08:55", updated_at: "2013-09-14 23:08:55">
2.0.0-p247 :047 > f.funnel_dat
f.funnel_data        f.funnel_data=       f.funnel_datum_ids   f.funnel_datum_ids=
2.0.0-p247 :047 > f.funnel_data
NameError: uninitialized constant FunnelStage::FunnelDatum
        from /usr/local/rvm/gems/ruby-2.0.0-p247@rails4test/gems/activerecord-4.0.0/lib/active_record/inheritance.rb:125:in `compute_type'
        from /usr/local/rvm/gems/ruby-2.0.0-p247@rails4test/gems/activerecord-4.0.0/lib/active_record/reflection.rb:178:in `klass'
        (...)
        from bin/rails:4:in `<main>'
2.0.0-p247 :048 > f.funnel_datum_ids
NameError: uninitialized constant FunnelStage::FunnelDatum
        from /usr/local/rvm/gems/ruby-2.0.0-p247@rails4test/gems/activerecord-4.0.0/lib/active_record/inheritance.rb:125:in `compute_type'
        from /usr/local/rvm/gems/ruby-2.0.0-p247@rails4test/gems/activerecord-4.0.0/lib/active_record/reflection.rb:178:in `klass'
        (...)
        from bin/rails:4:in `<main>'

所以现在,Rails 说的是拉丁语?(数据/数据...)

编辑并回答:好的,我自己想出来的。Rails 很难理解这种关联,因为它试图将“funnel_data”单数化为一个全新的“funnel_datum”名称(顺便说一句,这将是正确的)

所以我不得不写:

class FunnelStage < ActiveRecord::Base
    has_many :funnel_data, class_name: "FunnelData"
    (...)
end

让它工作。

非常感谢所有帮助我理解这一点的人......

4

4 回答 4

3

要解决您的问题,只需self.table_name = "funnel_datas"在您的模型定义下方添加:


在幕后 ActiveRecord 使用方法#tableize。从指南:

该方法tableize#underscore后跟#pluralize

根据经验,tableize对于简单案例,返回与给定模型相对应的表名。Active Record 中的实际实现并不是直接表化,因为它还解调了类名并检查了一些可能影响返回字符串的选项。

Pluralize,默认情况下使用常见的英语变形来获得单词的复数形式,但是"data"是复数。所以:

> "FunnelData".underscore #=> "funnel_data"
> "funnel_data".pluralize #=> "funnel_data"

因此,您的模型"funnel_data"默认会查找该表。

于 2013-09-18T08:30:51.907 回答
1

那是因为“数据”是一个不可数的词,rails 知道它:

> "data".pluralize
"data"

因此,您的表应命名为“funnel_data”。

于 2013-09-18T08:04:49.073 回答
1
"user".pluralize
=> "users"

但:

"data".pluralize
=> "data"

如果你想使用funnel_datas表名:

class FunnelData < ActiveRecord::Base
  set_table_name "funnel_datas"
end
于 2013-09-18T08:06:09.027 回答
0

在 rails 类名复数是表名,所以 funnel_data 复数是 funnel_data 所以不需要更改表名。

于 2013-09-18T08:05:08.120 回答