表多元化?

我有3个表具有以下关系(为了简单和清晰,表已被修剪):

create_table "users", force: :cascade do |t| t.string "name", limit: 255, null: false end create_table "sleeves", force: :cascade do |t| t.integer "user_id", limit: 4 t.integer "report_id", limit: 4 end create_table "reports", force: :cascade do |t| t.string "name", limit: 255, null: false end 

我的模特喜欢这样:

 class User < ActiveRecord::Base has_many :sleeves end class Sleeve < ActiveRecord::Base belongs_to :user has_many :reports end class Report < ActiveRecord::Base belongs_to :sleeve end 

但是,Rails中的某种复数似乎存在问题。 当我从控制台运行以下命令时:

 user = User.find(1) user.sleeves 

我收到以下错误:

 NameError: uninitialized constant User::Sleefe from "../gems/ruby-2.2.2/gems/activemodel-4.2.3/lib/active_record/inheritance.rb:158:in 'compute_type' 

如果我将模型中的用户关系更改为:

 class User < ActiveRecord::Base has_one :sleeve end 

一切正常(但我只收到一份报告,而不是我需要的所有报告)。 我怀疑问题是Sleeve这个词的多元化(因为错误说Sleefe – 这不是代码中的任何地方)。

谁能引导我走正确的道路进行修正?

多个表单在Rails中称为“ 变形 ”,它们是为您预定义的。

只是为了加深理解,Rails使用一堆正则表达式来确定基于单词结束方式使用的正确复数。 (您可以在your_application/lib/active_support/inflections.rb看到它们)。 正则表达式是匹配模式的有效方法,但它们依赖于目标材料的一致性。 英语作为一种自然语言,是不规则和不一致的,这就是“sleefe”之类的问题出现的原因。

在您的情况下,您希望通过对Inflector文件执行一些小手术来覆盖看似不正确的变形。

打开:

 your_application/config/initializers/inflections.rb 

编辑inflections.rb看起来像这样:

 ActiveSupport::Inflector.inflections do |inflect| inflect.irregular 'sleeve', 'sleeves' end