Невозможно создать собственную ссылочную ошибку - PullRequest
5 голосов
/ 01 сентября 2011

Я недавно обновил это приложение с рельсов 2.2.2 до 2.3.11. Все работало нормально до обновления. После обновления я получаю следующую ошибку:

ActiveRecord::HasAndBelongsToManyAssociationForeignKeyNeeded in InstrumentsController#arrow
Cannot create self referential has_and_belongs_to_many association on 'Trait#traits'. :association_foreign_key cannot be the same as the :foreign_key.

В подарочной модели:

class Gift < ActiveRecord::Base
  has_many :delegate_gifts
  has_many :answers

  belongs_to :feel_motive, :class_name => "Trait", :foreign_key => "feel_motive_id"
  belongs_to :see_motive, :class_name => "Trait", :foreign_key => "see_motive_id"
  belongs_to :incline_motive, :class_name => "Trait", :foreign_key => "incline_motive_id"

  has_and_belongs_to_many :users
  has_and_belongs_to_many :best_contributions

  def traits
    traits = []
    traits << feel_motive unless feel_motive.nil?
    traits << see_motive unless see_motive.nil?
    traits << incline_motive unless incline_motive.nil?
    return traits
  end
end

Модель черты:

class Trait < Field
  has_and_belongs_to_many :traits
end

Почему обновление с 2.2.2 до 2.3.11 приводит к этой ошибке?

1 Ответ

13 голосов
/ 01 сентября 2011

has_and_belongs_to_many не может указывать на себя (по крайней мере, не простым способом). Вот почему у вас есть «самоссылочная» ошибка. Если вам действительно нужна эта повторяющаяся ассоциация, тогда вы должны написать что-то вроде этого:

class User < ActiveRecord::Base
  has_and_belongs_to_many :friends,
    :class_name => "User",
    :association_foreign_key => "friend_id",
    :join_table => "friends_users"
end

, поэтому вам нужно дополнительное поле friend_id в таблице пользователей и новая таблица присоединения friends_users с полями: user_id и friend_id

Примечание: дополнительную информацию вы можете найти здесь: http://railsforum.com/viewtopic.php?id=4237)

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