【问题标题】:Getting a NameError with ActiveRecord and relationships使用 ActiveRecord 和关系获取 NameError
【发布时间】:2009-04-30 13:46:56
【问题描述】:

我在使用一对多关系时遇到了问题。我希望每个系列都有一个出版商,而一个出版商有多个系列。

这是我的发布者模型:

class Publisher < ActiveRecord::Base
  validates_presence_of :name
  has_many :series
end

这是我的 Serie 型号:

class Serie < ActiveRecord::Base
  belongs_to :publisher
end

这是失败的测试:

test "a publisher should have a list of series" do
  @publisher = Publisher.new :name => "Standaard Uitgeverij"
  @series = [ Serie.new(:name => "De avonturen van Urbanus", :publisher => @publisher),
              Serie.new(:name => "Suske en Wiske", :publisher => @publisher) ]
  assert_equal @series, @publisher.series
end

测试在最后一行失败,出现 NameError: uninitialized constant Publisher::Series。

我试图保存出版商和系列,但这没有奏效。我只尝试了一个系列,但这给出了同样的错误。

由于我刚刚开始使用 Rails 和 Ruby,所以我在这里不知所措。我做错了什么?

【问题讨论】:

  • 我将 has_many 关系重命名为 serie 并且在保存系列时,关系有效。但我想要名称系列而不是系列。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

要解决您在评论中提到的实际问题(我如何将我的模型命名为“系列”?),您需要让 Rails 的 Inflector 意识到此异常的默认值复数规则。

将以下内容添加到config/environment.rb

ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable 'series'
end

这将使您将模型命名为Series。您可以使用script/console 测试它是否有效:

>> "series".pluralize    #=> "series"
>> "series".singularize  #=> "series"

——我不得不说我刚刚尝试过使用The Pluralizer,看起来Rails 知道如何处理内置的series 这个词。 Try it for yourself.

【讨论】:

  • 模型名称是 Serie(单数),但我想在 Publisher 模型中使用的名称是 series(复数)。
  • 我明白,但型号名称应该是 Series,因为这是 Series 单词的正确单数形式。
【解决方案2】:

我相信约翰的回答是最好的。

也可以直接在has_many声明中指定类名

has_many :series, :class_name => 'Serie'

【讨论】:

  • 我正要发布这个答案。但这并没有解释为什么我的代码不被接受。据我说,代码遵循约定。我宁愿不在那里包含 class_name。
【解决方案3】:

您的 has_many 关系名称很好,但您的模型名称错误。

由于系列的单数和复数都是系列,因此您需要将模型从 Serie 重命名为 Series。之后,一切都会好起来的。

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多