Я прочитал this, поэтому я понимаю разницу.Rails 4 - has_one и принадлежит_от ошибки метания
Но я унаследовал приложение, которое бросает странное поведение (я думаю, возможно, я ошибаюсь, и это нормально).
Есть 2 модели:
class Pod < ActiveRecord::Base
has_one :pod_admin
end
class PodAdmin < ActiveRecord::Base
belongs_to :pod
end
В консоли рельсы, я попытался это:
p = Pod.find(5)
и он показывает это Pod имеет pod_admin_id
значение 14. Это правильно.
Я попытался изменить PodAdmin:
p.pod_admin = PodAdmin.last
и выдает эту ошибку:
NoMethodError: undefined method pod_admin_id for #<PodAdmin:0x007fa401f1e710>
Почему это? Что мне не хватает?
EDIT
на основе комментариев/ответов, не меняя модели, я попытался это:
pa = PodAdmin.last
pa.pod = p
и что работает, я вижу консоль вернуть последний PodAdmin с новым pod_id.
НО
pa.save
И
p.save
как бросить ту же ошибку, как и раньше.
Если я смотрю схему базы данных, в таблице Pod есть поле pod_admin_id, а в таблице PodAdmin есть поле pod_id.
Я унаследовал эту схему, и мне просто интересно, правильно ли это установил оригинальный разработчик. Конечно, я должен иметь возможность обновлять отношения с любого направления - не то, что точка создания has_one и принадлежит_to, так что вы можете иметь двунаправленные отношения, подобные этому?
EDIT 2
Я нашел проблему, которая является то, что я добавил эту строку в PodAdmin таблицу вместо Pod таблице:
validates :pod_admin_id, uniqueness: {scope: :id, message: 'The Pod already has a PodAdmin'}
Извинения - но как вы можете увидеть, что Я пытаюсь достичь здесь, чтобы не допустить, чтобы Pod получил 2 PodAdmins. Это подтверждается, похоже, не достигает этого.
Я могу это сделать:
p = Pod.find(5)
pa_last = PodAdmin.last
pa_first = PodAdmin.first
pa_last = p
pa_first = p
pa_last.save
pa_first.save
и теперь оба ПА имеют один и тот же pod_id. Как я могу предотвратить это?
EDIT 3
После долгих чтения и тестирования и благодаря как @Anand и @Spickerman проблема заключалась в том, что предыдущий разработчик поставил внешний ключ в обеих таблицах (has_one
и belongs_to
). Только таблица принадлежит к нужному внешнему ключу. Кроме того, отношения были определены неверно. Однако исправление этого не гарантирует надежное решение. Я настоятельно рекомендую другим с аналогичными проблемами читать this.
Вы делаете это неправильно. При настройке вашей ассоциации таблица 'pod_admins' должна иметь' pod_id'. – Pavan
@Pavan прав, вам нужно либо 'pod_id' в таблице' pod_admins', либо 'Pod' должно' принадлежит_to: pod_admin', а 'PodAdmin'' has_one: pod' –
pod_admins table У них есть поле pod_id. Я обновил свой вопрос, чтобы объяснить - кажется, я не могу обновить отношения с обеих сторон. – rmcsharry