表多元化?

时间:2015-09-01 17:31:59

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我有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 - 在代码的任何地方都没有。)

有人能引导我走上正确的道路进行修正吗?

1 个答案:

答案 0 :(得分:2)

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

为了加深理解,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