Получение NameError с ActiveRecord и отношениями
-
03-07-2019 - |
Вопрос
Я столкнулся с проблемой при использовании отношения один ко многим.Я хочу, чтобы у каждой серии был один издатель, а у одного издателя было много серий.
Это моя модель издателя:
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, я здесь в растерянности.Что я делаю не так?
Решение
Чтобы ответить на ваш актуальный вопрос, упомянутый в вашем комментарии (как мне назвать свою модель "Серия"?), вам нужно сделать Rails' Инфлектор известно об этом исключении из правил множественного числа по умолчанию.
Добавьте следующее в config/environment.rb
:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable 'series'
end
Это позволит вам назвать свою модель как Series
.Вы можете проверить, что это работает, используя script/console
:
>> "series".pluralize #=> "series"
>> "series".singularize #=> "series"
— Должен сказать, что я только что попробовал использовать Плюрализатор и похоже, что Rails знает, как обращаться со словом ряд встроенный. Попробуйте сами.
Другие советы
Я считаю, что ответ Джона — лучший.
Вы также можете напрямую указать имя класса в объявлении has_many.
has_many :series, :class_name => 'Serie'
Ваше имя отношения has_many в порядке, но имя вашей модели неверно.
Поскольку единственное и множественное число в названии серии являются сериями, вам необходимо переименовать модель из Серии в Серию.После этого все должно быть хорошо.