使用ActiveRecord和关系获取NameError

时间:2009-04-30 13:46:56

标签: ruby-on-rails ruby activerecord

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

这是我的发布商型号:

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

这是我的意甲模特:

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,我在这里不知所措。我做错了什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

您还可以在has_many声明

中直接指定类名
has_many :series, :class_name => 'Serie'

答案 2 :(得分:1)

您的has_many关系名称没问题,但您的型号名称错误。

由于单数和复数系列都是系列,您需要将模型从Serie重命名为Series。在那之后,一切都应该没问题。