Я прочитал это, поэтому я понимаю разница.
Но я унаследовал приложение, которое ведет себя странно (я думаю, возможно, я ошибаюсь, и это нормально).
Есть 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>
Это почему? Что мне не хватает?
ИЗМЕНИТЬ
Основываясь на комментариях / ответах, не меняя моделей, я попробовал следующее:
pa = PodAdmin.last
pa.pod = p
и это работает, я вижу, что консоль возвращает последний PodAdmin с новым pod_id.
НО
pa.save
И
p.save
оба выдают ту же ошибку, что и раньше.
Если я посмотрю на схему базы данных, в таблице Pod есть поле pod_admin_id, а в таблице PodAdmin есть поле pod_id.
Я унаследовал эту схему, и мне просто интересно, правильно ли ее настроил исходный разработчик. Конечно, я должен иметь возможность обновлять отношения с любого направления - разве не в этом смысл создания has_one и own_to, чтобы у вас могли быть такие двунаправленные отношения?
ИЗМЕНИТЬ 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
и теперь оба pa имеют одинаковый pod_id. Как я могу этого избежать?
ИЗМЕНИТЬ 3
После долгого чтения и тестирования и благодарности @Anand и @Spickerman проблема заключалась в том, что предыдущий разработчик поместил внешний ключ в обе таблицы (has_one
и belongs_to
). Только таблица own_to должна иметь внешний ключ. Кроме того, отношения были неправильно определены. Однако исправление этого не гарантирует надежного решения. Я настоятельно рекомендую другим лицам с аналогичными проблемами прочитать это.
pod_admins
таблица должна иметьpod_id
. - person Pavan   schedule 13.05.2016pod_id
вpod_admins
таблице, либоPod
долженbelongs_to :pod_admin
, аPodAdmin
has_one :pod
- person Rob Di Marco   schedule 13.05.2016