我有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 - 在代码的任何地方都没有。)
有人能引导我走上正确的道路进行修正吗?
答案 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