Как заставить has_many использовать определенный: foreign_key? - PullRequest
0 голосов
/ 05 августа 2011

У меня проблемы с моделью, не соблюдающей политику: foreign_key.

Модель персонажа имеет следующие поля: Имя: строка Уровень: ИНТ сфера: строка realm_id: целое число

class Character < ActiveRecord::Base
  belongs_to :realm

end

Моя модель Realms выглядит так:

class Realm < ActiveRecord::Base
  has_many :characters, :foreign_key => "realm_id"

end

Однако, похоже, что она заставляет модель персонажа использовать столбец: realm в качестве значения Foreign_key вместо: realm_id. Я понятия не имею, почему или как это исправить. Есть ли другой способ заставить его игнорировать поле: realm и перейти к: realm_id без необходимости изменять имя столбца?

[Изменить для ясности]

Модель персонажа имеет поле realm_id: integer. Я пытался не иметь Foreign_key, но результаты с обоими идентичны.

ruby-1.9.2-p136: 012> c = Character.new => #

ruby-1.9.2-p136: 013> c.realm = "Саргерас"

ActiveRecord :: AssociationTypeMismatch: ожидается область (# 2154038240), получена строка (# 2151988680)

Несмотря на то, что у него есть Foreign_key, он просто отказывается отпустить столбец области.

[Изменить 2]

Столбец области просто вступит во владение из-за ассоциации has_many и own_to. Пока что нет способа сломать это, поэтому решение состоит в том, чтобы либо удалить столбец (подход, который я выберу), либо переименовать его во что-то другое.

Ответы [ 3 ]

1 голос
/ 05 августа 2011

Убедитесь, что в вашей таблице символов есть столбец realm_id ?Пожалуйста, убедитесь в этом, а затем избавьтесь от foreign_key => 'realm_id , в этом нет необходимости.Ваша программа должна работать, если вы выполнили обе эти вещи.

0 голосов
/ 05 августа 2011

belongs_to :realm создает (среди прочего) методы с именами realm и realm=, используемые как методы получения и установки. Это означает, что магия method_missing, которую ActiveRecord использует для представления столбцов базы данных в качестве атрибутов, никогда не срабатывает, когда вы выполняете функцию Character # realm, поскольку этот метод на самом деле не отсутствует.

Если вы хотите избежать переименования столбца области в вашей базе данных, вы можете создать атрибуты доступа для поля вручную под другим именем:

class Character < ActiveRecord::Base
  def realm_name
    self['realm']
  end

  def realm_name=(value)
    self['realm'] = value
  end
end

Таким образом, вы по-прежнему будете иметь столбец области в вашей базе данных и сможете получить доступ к атрибуту в Ruby, хотя и под другим именем. Это не очень хорошая идея, так как вы будете дублировать имя области как Character#realm_name и Character.realm.name.

Я бы отбросил столбец realm и вместо этого убедился бы, что при импорте из источника данных я использую Realm объекты:

character.realm = Realm.find_by_name('Sargeras')

Таким образом, вы сможете использовать только те данные, которые имеют смысл; в модели Realm.

0 голосов
/ 05 августа 2011

Вам вообще не нужна здесь часть :foreign_key, поскольку вы следуете стандартному соглашению об именах Rails, столбец realm_id должен быть выведен из названия модели.

EDIT

Понятно. Я не думаю, что вы можете иметь столбец и ассоциацию с одним и тем же именем в одной модели. Возможно, самым простым решением было бы переименовать столбец «realm» в «realmname» или что-то в этом роде.

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