Почему Rails не создает автоматически записи в таблице соединений? - PullRequest
3 голосов
/ 11 сентября 2010

У меня есть простое отношение has_many через:

class Tag < ActiveRecord::Base
  has_many :profile_tags
  has_many :profiles, :through => :profile_tags
end

class ProfileTags < ActiveRecord::Base
  belongs_to :profile
  belongs_to :tag
end

class Profile < ActiveRecord::Base
  has_many :profile_tags
  has_many :tags, :through => :profile_tags
end

На мой взгляд, я принимаю набор тегов (только строки) и перебираю их в моем контроллере, вызываю Tag.create (...) для каждого из них и помещаю их в массив. Это все отлично работает.

Итак, я попал в точку, где у меня есть объекты (теги) Array of Tag, каждый из которых был возвращен вызовом create, и переменная @profile, которая была создана с помощью Profile.new

Я хотел бы сделать: @profile.tags = tags

Выполнение этого вызывает эту ошибку в строке, где я пытаюсь присвоить:

uninitialized constant Profile::ProfileTag

Rails действует так, как будто мне нужно вручную создавать и назначать ассоциации таблиц соединений, хотя здесь http://guides.rubyonrails.org/association_basics.html#the-has_many-through-association говорится, что когда вы выполняете такое назначение, будут создаваться новые ассоциации, и если некоторые из них исчезнут, они будут удалены.

Есть идеи, что я мог бы сделать не так?

1 Ответ

4 голосов
/ 11 сентября 2010

Rails предполагает, что классы моделей имеют имена в единственном числе, то есть класс ProfileTags должен называться ProfileTag.

В зависимости от того, какую версию Rails вы используете, возможно, самый простой способ исправить это - пересоздать модель, используя script/destroy и script/generate в Rails 2.x или rails destroy и rails generate в Rails 3 .

Кроме того, указание имени класса вручную путем добавления :class_name => 'ProfileTags' к объявлениям has_many также должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...