表多元化?
我有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