Я столкнулся с проблемой при использовании отношения "один ко многим". Я хочу, чтобы у каждой серии был один издатель, а у одного издателя - много серий.

Это моя модель издателя:

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: неинициализированная константа Publisher :: Series.

Я пытался спасти издателя и серию, но это не сработало. Я пробовал только с одной серией, но это дает ту же ошибку.

Поскольку я только начинаю работать с Rails и Ruby, я здесь в растерянности. Что я делаю неправильно?

0
Thijs Wouters 30 Апр 2009 в 17:46
Я переименовал отношение has_many в серию, и при сохранении серии связь работает. Но я хочу иметь серию имен вместо серии.
 – 
Thijs Wouters
30 Апр 2009 в 17:57

3 ответа

Лучший ответ

Чтобы ответить на ваш фактический вопрос, упомянутый в вашем комментарии ( как я могу назвать свою модель "Series"? ), вам нужно сделать Rails 'Inflector знает об этом исключении из правил множественного числа по умолчанию.

Добавьте следующее в config/environment.rb:

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

Это позволит вам назвать вашу модель как Series. Вы можете проверить, что это работает, используя script/console:

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

—Я должен сказать, что я только что попытался использовать Pluralizer, и похоже, что Rails знает о том, как работать со словом series built-in. Попробуйте сами.

1
John Topley 30 Апр 2009 в 18:18
Название модели - Serie (единственное число), но имя, которое я хочу использовать в модели Publisher, - series (множественное число).
 – 
Thijs Wouters
30 Апр 2009 в 18:30
Я понимаю это, но название модели должно быть Series, потому что это правильная форма единственного числа от слова Series.
 – 
John Topley
30 Апр 2009 в 18:35

Я считаю, что ответ Джона лучший.

Вы также можете напрямую указать имя класса в объявлении has_many

has_many :series, :class_name => 'Serie'
1
Mike H 30 Апр 2009 в 18:27
Я как раз собирался опубликовать этот ответ. Но это не объясняет, почему мой код не принят. На мой взгляд, код следует условностям. Я бы предпочел не включать сюда class_name.
 – 
Thijs Wouters
30 Апр 2009 в 18:32

Ваше имя отношения has_many в порядке, но имя вашей модели неправильное.

Поскольку и единственное, и множественное число серий являются сериями, вам необходимо переименовать вашу модель из Serie в Series. После этого все должно быть хорошо.

1
tomafro 30 Апр 2009 в 18:32