Rails 中模型的不正确复数

Posted

技术标签:

【中文标题】Rails 中模型的不正确复数【英文标题】:Incorrect Pluralizing of Model in Rails 【发布时间】:2012-09-19 04:41:48 【问题描述】:

我查看了 Stack Overflow 和使用 Rails 进行敏捷开发,但找不到任何可以回答我需要的所有部分的内容。

我刚刚在 rails 中生成了一个 Cow 模型。显然,Rails 使用了牛(“kine”)的过时复数形式,所以当我创建该模型时,它构建了一个 Kine 迁移:

class CreateKine < ActiveRecord::Migration
  def change
    create_table :kine do |t|
      t.string :name
      t.string :farm
      t.string :breed

      t.timestamps
    end
  end
end

我知道我可以进入模型的 .rb 文件并将 set_table_name 返回到 cow,但我担心关联的控制器。如果我创建一个 Cows 控制器,它不会同步吗?

如何让所有东西都变成牛/牛?谢谢。这是我的第一个应用程序之一,我已经对管理控制器模型关联感到困惑,所以这个变形问题没有帮助。

【问题讨论】:

这个相当神秘的不规则变形是removed from Rails a few days ago。未来的版本将正确地将cow 变形为cows 很高兴听到。虽然这对于所有想要编写 Rails 4 应用程序来优化 14 世纪盎格鲁-撒克逊牛群的人来说都是很糟糕的。 【参考方案1】:

这里是一个例子:

config>initializers>inflections.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.irregular 'cow', 'cows'
end

【讨论】:

太棒了。然后再次运行 rake db:migrate? 或者我应该回滚模型然后重新生成它? 这是正确的答案。 @Sasha,只需删除迁移并重新运行生成器;这次它应该生成Cows @Sasha 只是销毁您生成的内容:rails destroy model Cow 然后在添加此答案中提到的代码后运行生成器【参考方案2】:

尝试重命名表:

class RenameKineToCows< ActiveRecord:Migration

  def up
    rename_table :kine, :cows
  end 
  def down
    rename_table :cows, :kine
  end
end

将您的 app/models/kine.rb 重命名为 cow.rb 并编辑文件

class Cow < ActiveRecord::Base

  self.table_name = 'Cow'
end

将您的 app/controllers/kine_controller.rb 重命名为 cows_controller.rb 并编辑文件

class KineController < ApplicationController 

class CowsController < ApplicationController

并编辑 config/routes.rb

resources :kine

resources :cows

【讨论】:

非常感谢!只是双重检查。在您编写的迁移中,self.up 和 self.down 应该相同吗?还是 self.down 应该是“rename_table :cows, :kine”?

以上是关于Rails 中模型的不正确复数的主要内容,如果未能解决你的问题,请参考以下文章

Ruby On Rails:用于其他语言的复数形式

如何在 Rails 中正确使用 ActiveStorage 进行模型测试?

Ruby on Rails 复数模型名称

覆盖rails3中模型名称的默认复数

优化重复 Rails 代码的正确方法

Rails Association Has_One 具有复数模型名称而不是单数且不工作